OC 实例变量(instance var)与属性(@property)的关系 isa指针
实例变量(instance var)与属性(@property)的关系
Objective-C 2.0之后,声明一个@property name自动产生一个实例变量,名为_name,因此省去实例变量和属性重复输入的麻烦。而使用@synthesize可以改变_name名称。@property和@synthesize不必成对出现。
@property name:指示编译器自动合成setter和getter方法,setter方法名即setName,而getter方法名即name。@property后面的关键字,例如readonly、readwrite、retain、nonatomic、copy等,指定如何生产setter和getter方法。这些属性修饰符大致分为四类:
(1)可变性 (Mutability)
- readonly,只生成getter方法,没有setter方法
- readwrite,是默认的
(2)内存管理 (Memory management)
- assign,是默认的,适用于内置类型(int, bool等)或者代理对象(delegate),不存在引用计数机制。
- retain,只适用于对象,不适用内置类型(int, bool等)。当使用setter方法时,将对象的引用计数加1。
- copy,使用setter方法时,拷贝一个对象,即在内存中产生新对象,而不是把原来的对象的引用计数加1。显然,复制出来的新对象的引用计数为1。
(3)并发性 (Concurrency)
- nonatomic,访问属性非原子性,一般单线程声明nonatomic,考虑到速度问题。多线程程序就不要使用nonatomic。
- atomic,访问属性原子性,与nonatomic相反。
(4)API控制 (API control)
- getter=newGetterName,指定新的getter方法名,一般重新改写BOOL实例变量的getter名。例如
![](https://code.csdn.net/assets/CODE_ico.png)
- @property (getter=isFinished) BOOL finished;
- setter=,指定新的setter方法名。
@synthesize name = custom_name:将实例变量_name名称换成custom_name
@synthesize name:将实例变量_name名称换成name
注意:@synthesize不会影响@property产生的setter和getter方法的名称
setter和getter方法什么时候被调用?
例如,属性声明如下
![](https://code.csdn.net/assets/CODE_ico.png)
- @interface Person : NSObject
- @property NSString *firstName; // atomic, assign, readwrite (default)
- @end
有2种方法:
(1)显示调用(发送消息)
![](https://code.csdn.net/assets/CODE_ico.png)
- [somePerson firstName]; // Call getter method
- [somePerson setFirstName: @"Johnny"]; // Call setter method
(2)隐式调用(点语法)
![](https://code.csdn.net/assets/CODE_ico.png)
- NSString *firstName = somePerson.firstName; // Call getter method
- somePerson.firstName = @"Johnny"; // Call setter method
如果在实例方法中直接使用实例变量,则不会调用对应的setter和getter方法,例如
![](https://code.csdn.net/assets/CODE_ico.png)
- - (void)someMethod
- {
- NSString *myString = _firstName; // Won't call getter method
- _firstName = @"A string"; // Won't call setter method
- }
显然直接使用实例变量会有风险,如内存泄露、循环引用等。最好访问实例变量,都通过@property产生的setter和getter方法。
转载于:https://www.cnblogs.com/oc-bowen/p/5016901.html
OC 实例变量(instance var)与属性(@property)的关系 isa指针相关推荐
- 类变量(Class Variables)和实例变量(Instance Variables)
类变量(Class Variables)和实例变量(Instance Variables) 1.来自于Python官网教程的示例 class Dog:kind = 'canine' # class v ...
- iOS class深入理解: 实例对象、类对象、元类和isa指针
你要知道的class都在这里 转载请注明出处http://blog.csdn.net/u014205968/ 深入代码理解instance.class object.metaclass 面向对象编程中 ...
- OC实例变量和属性-@synthesize与@property
Student.h 1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject 4 { 5 // 实例变量命 ...
- oc 实例变量可见度、方法
为什么80%的码农都做不了架构师?>>> ⼀.实例变量可⻅度 @public 在类的外部和内部均可访问 @protected(默认) 只 ...
- OC 成员变量和属性的区别 .
转自:http://blog.sina.com.cn/s/blog_727bd1560101llwj.html 比如下面这个程序,aboutList,和 otherList 到底有什么不同, @int ...
- IOS开发中的变量、方法、属性
转自 :http://www.0jl.com/?p=509 1.在Objective语言中可以声明实例变量(Instance Variables). 变量有四种访问范围: 私有(private): 在 ...
- 在对象内部尽量直接訪问实例变量 --Effictive Objective-C 抄书
在对象之外訪问实例变量时,应该总是通过属性来做.在那么在对象内部訪问实例变量的时候,又该怎样呢? 这是 OCer们一直激烈讨论的问题.有人觉得,不管什么情况,都应该通过属性来訪问实例变量;也有人说,& ...
- 在对象内部尽量直接访问实例变量 --Effictive Objective-C 抄书
在对象之外访问实例变量时,应该总是通过属性来做.在那么在对象内部访问实例变量的时候,又该如何呢? 这是 OCer们一直激烈讨论的问题.有人认为,无论什么情况,都应该通过属性来访问实例变量;也有人说,& ...
- 7、在对象内部尽量直接访问实例变量
本文概要: 1.首先给出结论是:除了几种特殊情况外,在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做. 2.讲解了使用getter.setter的好处. 3.列举了几种上面提 ...
最新文章
- 【2022新书】机器学习基础
- 第4章 类型基础 -- 4.1 所有类型都从System.Object派生
- python爬虫库的功能_Python学习爬虫掌握的库资料大全和框架的选择的分析
- go gin 第二次使用ShouldBindJSON失效的原因及解决办法:使用ShouldBindBodyWith代替
- Php正则替换字符串
- android 安装卸载应用提醒_Android监听程序的安装和卸载
- 浅谈C# Socket编程及C#如何使用多线程
- LINUX版本的 MYSQL大小写敏感的处理方式
- Socket选项系列之TCP_NODELAY
- 腾讯云linux读取windows数据盘,腾讯云服务器Centos挂载数据盘的方法
- dockerfile入门
- 上课笔记-指针(从百草园到三味书屋)
- 2017先给自己定一个小目标,比方说先挣一个亿
- 在文件管理器中显示图片的缩略图和视频第一帧的缩略图
- 计算机网络部分知识梳理
- 什么工作工资高?怎么找适合自己的高薪工作?
- Unity开发游戏中全面屏手机的屏幕适配
- 有趣的GitHub-Badge
- 2020年十本最值得阅读的前端书籍推荐(本文送书10本)
- 人工智能导论——A*算法实验
热门文章
- cnetos6,centos7添加新网卡,系统不识别的解决办法
- 基于nginx环境部署nagios
- Flex scroller皮肤的使用
- LINUX 下设置系统时间 DATE 命令
- GitHub控件之BadgeView(数字提醒)
- Android 应用程序消息处理机制(Looper、Handler)分析
- 【android】进程优先级(Framework设置优先级,LowMemoryKiller查杀)
- JavaScript instanceof的实现
- Android复合控件创建与使用Demo
- Java并发编程—volatile关键字(保证变量的可见性、有序性机制)