今天总结了以下内容, 先写下来, 以备以后忘记, 或者是混乱时, 回头来看一下…
实例变量
实例变量(默认是私有的)用于类内部, 无需与外界接触的变量, 不能使用点语法. 只用于简单存储数据, 不涉及到内存管理. 通过 _实例变量名 来调用, 只是简单地指针赋值, 没有调用 setter 方法, 引用计数不会增一.
属性( 例如属性名为 object )
允许让其他对象访问到该属性, 可以使用点语法, 涉及到内存管理, 通过 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 方法,( 这块内存空间会在将来的某一时刻被释放).