OC 内存管理-02 autorelease 概念 以及用法
(1) @autoreleasepool { }//自动释放池代表,池子将要被销毁,对池子中所有的对象进行一次release操作 (2) 不管你这个对象时在@autoreleasepool 之内创建的还是在之外创建的,只要你在池子中调用了autorelease那么这个对象就会被放入到池子中 (3) 只有在自动释放池的作用域中调用对象的autorelease方法才能够正确的讲对象放入到池子中 (4) 如果在自动释放池中一个对象被多次释放[autorelease],那么会报野指针错误 ----------------------------验证代码--------------------- // // main.m // //内存管理原则(配对原则):只要出现了new,alloc,retain方法,就要配对出现release,autorelease //对象存入到自动释放池中,当这个池子被销毁的时候他会对池子中所有的对象进行一次release操作 //怎么把对象存到池子中 #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { /* 示例1 //自动释放池 //大括号代表池子的作用域 @autoreleasepool { //release 功能 retaincount - 1 //autorelease 好像功能也是 retaincount - 1 ? //1 Person * p = [[Person alloc] init]; // [p release];//retainCount立即 -1 [p autorelease]; //autorelease方法的作用只是将对象放入到池子中,然后返回一个self NSLog(@"asdfasdf"); }//代表,池子将要被销毁,对池子中所有的对象进行一次release操作,[p release] 0 */ /* //autoreleasepool我么可以自己随意的创建 // 示例2 //1//不管你这个对象时在@autoreleasepool 之内创建的还是在之外创建的,只要你在池子中调用了autorelease那么这个对象就会被放入到池子中 Person * p = [[Person alloc ] init]; @autoreleasepool { [p autorelease]; }//p 0 */ // 示例3 /* //1 只有在自动释放池的作用域中调用对象的autorelease方法才能够正确的讲对象放入到池子中 Person * p = [[Person alloc] init]; [p autorelease]; NSLog(@"aaaa"); @autoreleasepool { } NSLog(@"bbb"); */ //示例4 /* // 1 Person * p = [[Person alloc] init]; @autoreleasepool { [p autorelease];//加入第一次 [p autorelease];//加入第二次 NSLog(@"abc"); }//[p release]0 [p release] NSLog(@"cbd"); */ //示例5 /* //1 Person * p = [[Person alloc] init]; @autoreleasepool { @autoreleasepool { [p autorelease]; }//?[p release] 0 } */ Person * p = [[Person alloc] init]; @autoreleasepool { [p autorelease]; @autoreleasepool { [p autorelease]; }//[p release] 0 }//[p release]; return 0; }