实例变量(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名。例如

[objc] view plaincopy
  1. @property (getter=isFinished) BOOL finished;

- setter=,指定新的setter方法名。

@synthesize name = custom_name:将实例变量_name名称换成custom_name

@synthesize name:将实例变量_name名称换成name

注意:@synthesize不会影响@property产生的setter和getter方法的名称

setter和getter方法什么时候被调用?

例如,属性声明如下

[objc] view plaincopy
  1. @interface Person : NSObject
  2. @property NSString *firstName; // atomic, assign, readwrite (default)
  3. @end

有2种方法:

(1)显示调用(发送消息)

[objc] view plaincopy
  1. [somePerson firstName]; // Call getter method
  2. [somePerson setFirstName: @"Johnny"]; // Call setter method

(2)隐式调用(点语法)

[objc] view plaincopy
  1. NSString *firstName = somePerson.firstName; // Call getter method
  2. somePerson.firstName = @"Johnny"; // Call setter method

如果在实例方法中直接使用实例变量,则不会调用对应的setter和getter方法,例如

[objc] view plaincopy
  1. - (void)someMethod
  2. {
  3. NSString *myString = _firstName; // Won't call getter method
  4. _firstName = @"A string"; // Won't call setter method
  5. }

显然直接使用实例变量会有风险,如内存泄露、循环引用等。最好访问实例变量,都通过@property产生的setter和getter方法。

转载于:https://www.cnblogs.com/oc-bowen/p/5016901.html

OC 实例变量(instance var)与属性(@property)的关系 isa指针相关推荐

  1. 类变量(Class Variables)和实例变量(Instance Variables)

    类变量(Class Variables)和实例变量(Instance Variables) 1.来自于Python官网教程的示例 class Dog:kind = 'canine' # class v ...

  2. iOS class深入理解: 实例对象、类对象、元类和isa指针

    你要知道的class都在这里 转载请注明出处http://blog.csdn.net/u014205968/ 深入代码理解instance.class object.metaclass 面向对象编程中 ...

  3. OC实例变量和属性-@synthesize与@property

    Student.h 1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject 4 { 5 // 实例变量命 ...

  4. oc 实例变量可见度、方法

    为什么80%的码农都做不了架构师?>>>    ⼀.实例变量可⻅度 @public                   在类的外部和内部均可访问 @protected(默认)   只 ...

  5. OC 成员变量和属性的区别 .

    转自:http://blog.sina.com.cn/s/blog_727bd1560101llwj.html 比如下面这个程序,aboutList,和 otherList 到底有什么不同, @int ...

  6. IOS开发中的变量、方法、属性

    转自 :http://www.0jl.com/?p=509 1.在Objective语言中可以声明实例变量(Instance Variables). 变量有四种访问范围: 私有(private): 在 ...

  7. 在对象内部尽量直接訪问实例变量 --Effictive Objective-C 抄书

    在对象之外訪问实例变量时,应该总是通过属性来做.在那么在对象内部訪问实例变量的时候,又该怎样呢? 这是 OCer们一直激烈讨论的问题.有人觉得,不管什么情况,都应该通过属性来訪问实例变量;也有人说,& ...

  8. 在对象内部尽量直接访问实例变量 --Effictive Objective-C 抄书

    在对象之外访问实例变量时,应该总是通过属性来做.在那么在对象内部访问实例变量的时候,又该如何呢? 这是 OCer们一直激烈讨论的问题.有人认为,无论什么情况,都应该通过属性来访问实例变量;也有人说,& ...

  9. 7、在对象内部尽量直接访问实例变量

    本文概要: 1.首先给出结论是:除了几种特殊情况外,在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做. 2.讲解了使用getter.setter的好处. 3.列举了几种上面提 ...

最新文章

  1. 【2022新书】机器学习基础
  2. 第4章 类型基础 -- 4.1 所有类型都从System.Object派生
  3. python爬虫库的功能_Python学习爬虫掌握的库资料大全和框架的选择的分析
  4. go gin 第二次使用ShouldBindJSON失效的原因及解决办法:使用ShouldBindBodyWith代替
  5. Php正则替换字符串
  6. android 安装卸载应用提醒_Android监听程序的安装和卸载
  7. 浅谈C# Socket编程及C#如何使用多线程
  8. LINUX版本的 MYSQL大小写敏感的处理方式
  9. Socket选项系列之TCP_NODELAY
  10. 腾讯云linux读取windows数据盘,腾讯云服务器Centos挂载数据盘的方法
  11. dockerfile入门
  12. 上课笔记-指针(从百草园到三味书屋)
  13. 2017先给自己定一个小目标,比方说先挣一个亿
  14. 在文件管理器中显示图片的缩略图和视频第一帧的缩略图
  15. 计算机网络部分知识梳理
  16. 什么工作工资高?怎么找适合自己的高薪工作?
  17. Unity开发游戏中全面屏手机的屏幕适配
  18. 有趣的GitHub-Badge
  19. 2020年十本最值得阅读的前端书籍推荐(本文送书10本)
  20. 人工智能导论——A*算法实验

热门文章

  1. cnetos6,centos7添加新网卡,系统不识别的解决办法
  2. 基于nginx环境部署nagios
  3. Flex scroller皮肤的使用
  4. LINUX 下设置系统时间 DATE 命令
  5. GitHub控件之BadgeView(数字提醒)
  6. Android 应用程序消息处理机制(Looper、Handler)分析
  7. 【android】进程优先级(Framework设置优先级,LowMemoryKiller查杀)
  8. JavaScript instanceof的实现
  9. Android复合控件创建与使用Demo
  10. Java并发编程—volatile关键字(保证变量的可见性、有序性机制)