(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;
}