| 
 
| 内存管理范围:任何继承了NSObject的对象,对其他基本数据类型无效。
 每个OC对象都有自己的引用计数器,用来表示对象被引用的次数。
 每个OC对象内部都有4个字节的存储空间用来存储引用计数器。
 
 使用alloc、new或者copy创建新对象的时候,新对象的引用计数器默认值为1
 当一个对象的引用计数器的值为0时,对象占用的内存就会被系统回收。
 
 引用计数器的用法
 1> retain:计数器+1,会返回对象本身
 2> release:计数器-1,没有返回值
 3> retainCount:获取对象当前的引用计数器的值
 
 对象销毁
 当一个对象的引用计数器的值为0时,该对象将被销毁,其占用的内存被系统回收。
 当一个对象被回收时,调用dealloc方法。一般情况下会重写dealloc,来释放相关资源。
 重写dealloc方法时,有一定要在最后面调用[super dealloc]。
 对象被回收之后,其占用的内存不可再用。
 
 内存管理的简单操作
 int main()
 {
 Person *p = [[Person alloc] init]; // 创建对象,此时引用计数器值为:1
 
 [p retain]; // 对对象p做一次retain操作 引用计数器+1,此时为:2
 
 [p release]; // 对对象p做一次release操作 引用计数器-1,此时为:1
 
 [p release]; // 对对象p做一次release操作 引用计数器-1,此时为:0
 
 // p.name = @"jack"; // 这时p为野指针,p指向的对象为僵尸对象
 p = nil; // 将p指针的值清空
 
 return 0;
 }
 僵尸对象:所占用内存已经被回收的对象,僵尸对象不能使用
 野指针:指向僵尸对象的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 空指针:没有指向任何东西的指针(存储的内容是nil、NULL、0),给空指针发送消息不会报错。
 
 多对象之间的内存管理
 使用某个对象,则对该对象做一次retain操作。结束使用时,对该对象做一次release操作
 谁retain,谁release;谁alloc,谁release。如下:
 @class Dog; // 因为Dog类还没有声明,要先告诉编译器Dog是一个类
 @interface Person : NSObject
 @property(assign,nonatomic) NSString *name;
 @property(assign,nonatomic) int age;
 // Person对象包含一个Dog对象,当调用Dog对象时,要对dog对象进行一次retain操作
 @property(retain,nonatomic) Dog *dog;
 @end
 @implementation Person
 - (void)setDog:(Dog *)dog
 {   // 判断dog是否为新dog
 if (dog != _dog) {
 // 是新dog则对老dog进行一次release操作
 [_dog release];
 // 对新dog进行一次retain操作
 _dog = [dog retain];
 }
 }
 // dealloc重写,用来release Person的Dog
 - (void)dealloc
 {
 // 谁retain谁release,当_dog的值为nil、NULL、0时 对它发送release消息,没有任何意义
 [_dog release];
 // 重写dealloc要在最后面调用父类的dealloc方法[super dealloc]
 [super dealloc];
 }
 @end
 @class:告诉编译器某个名称是一个类的名称,用于.h文件内,在.m中使用improt包含类的所有内容
 
 @property参数
 set方法内存管理相关参数
 retain:release旧值,retain新值(适用于OC对象类型)
 assign:直接赋值(默认、适用于非OC对象类型)
 copy:release旧值,copy新值(一般用于NSString *)
 
 set、get方法的生成
 readwrite:同时生成set方法和get方法的声明与实现(默认)
 readonly:只生成get方法的声明与实现
 
 | 
 |