OC 中实例变量与属性之间的区别

实例变量

实例变量(默认是私有的)用于类内部, 无需与外界接触的变量, 不能使用点语法. 只用于简单存储数据, 不涉及到内存管理. 通过 _实例变量名 来调用, 只是简单地指针赋值, 没有调用 setter 方法, 引用计数不会增一.

属性

允许让其他对象访问到该属性, 可以使用点语法, 涉及到内存管理, 通过 self.object操作属性, 通过 setter 和 getter 方法来调用, 在调用 setter 方法的过程中引用计数会发生变化

实例变量和 getter 方法的使用时机

在类的初始化方法中, 会使用属性的 setter 方法而不直接使用系统自动生成的实例变量的原因是因为如果直接使用系统自动生成的实例变量, 可能会造成野指针问题, 在 dealloc 方法中还会造成过度释放的问题; 而使用 setter 方法时, 会先让属性的内存空间的引用计数加 1. 在初始化类对象的时候不会因为参数的释放而造成内存问题

//先初始化一个Person类对象, 该类中有一个属性name

NSString *name = [[NSString alloc] initWithString:@"Sara"];

Person *per = [[Person alloc] initWithName:name];

[name release];

如果在自定义初始化方法中使用_name = name 的话仅仅只是简单地让_name指向 name 的内存空间, 而引用计数不变,当 name 释放了之后, _name 指向的那块内存空间已经被系统回收, 就是野指针了, 这就产生了内存问题, 特别是在 MRC 的 dealloc 方法中有 self.name = nil;(==> [_name release]; _name = nil;)这就又产生了过度释放的问题

由上面的例子可以总结出以下内容:

实例变量的使用时机是 : 在本类中只是简单地存储变量值, 而不涉及到释放的时候使用

getter 方法的使用时机是 : 当后期这个类对象可能会被释放, 而其他变量还需要继续使用这个值的时候, 就需要对内存进行管理, 即对该块内存空间的引用计数加 1, 而这不仅仅是简单地赋值就能解决的. 所以在这种时候要使用 getter 方法,( 这块内存空间会在将来的某一时刻被释放).

————————————————

版权声明:本文为CSDN博主「lsfreda」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u010358868/article/details/49968207

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (答案不唯一,仅供参考,文章最后有福利) 一. iOS面试题---UI相关:事件传递,图像显示,性能优化,离屏渲染...
    ios南方阅读 2,780评论 0 12
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,688评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,362评论 0 11
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,026评论 1 16