| 
 
| autorelease方法
 1> 会将对象放到一个自动释放池中
 2> 当自动释放池被销毁时,会对池内所有对象做一次release操作
 3> autorelease方法会返回对象本身
 4> 调用autorelease方法之后,对象的计数器不变
 
 自动释放池
 在程序运行过程中,可以创建多个自动释放池。自动释放池以栈的形式存在内存中(先进后出)
 当对象调用autorelease方法时,会将该对象放到栈顶的释放池
 
 创建自动释放池
 int main()
 {
 // 创建自动释放池
 @autoreleasepool{
 // 创建对象,并调用autorelease方法
 Person *p = [[[Person alloc] init] autorelease];
 } // 自动释放池销毁,对象销毁
 return 0;
 }
 当对象占用内存较大时,不要使用autorelease。调用autorelease之后,不用再使用release。
 一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
 
 开发中可以提供一些类方法来快速创建已经autorelease的对象
 + (id)person
 {
 // 创建对象时,不直接使用类名,使用self
 return [[[self alloc] init] autorelease]
 }
 ARC(Automatic Reference Counting)
 在ARC模式下把指针分为两种
 强指针:默认情况下,所有指针都是强指针__strong
 弱指针:__weak
 
 ARC的判断准则:只要没有强指针指向对象,就会释放对象
 @interface Person : NSObject
 @property(strong,nonatomic) Dog *dog;
 @end
 @implementation Person
 // 重写dealloc
 -(void)dealloc
 {
 NSLog(@"Person被杀死了");
 // [super dealloc];不允许调用
 }
 @end
 @interface Dog : NSObject
 @property(weak,nonatomic) Person *person;
 @end
 @implementation Dog
 - (void)dealloc
 {
 NSLog(@"Dog被杀死了");
 }
 @end
 int main()
 {
 // ARC模式下的循环调用
 Person *p = [[Person alloc] init];
 Dog *d = [[Dog alloc] init];
 
 p.dog = d;
 d.person = p;
 return 0;
 }// 程序结束,所有对象被销毁
 
 
 | 
 |