1.
对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。
上面那句话不怎么好理解 说的很虚。还是看个实际的例子:
int main (int argc , const char * argv[]){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Person *person=[Person new];
[person setName: @"张明"];
[person setPid: 1];
[person setHeight: 185.5];
//归档对象
NSData *data=[NSKeyedArchiver archivedDataWithRootObject: person];
[data writeToFile: @"person.db" atomically: NO];
[person release];
//还原数据为对象
Person *person2=[NSKeyedUnarchiver unarchiveObjectWithData: data];
NSLog(@"%@",[person2 name]);
[pool release];
return 0;
}
这里这里函数前面声明了
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
这个作用就是:将他下面新建的对象(除new allc copy以外,如果alloc init autoralease 那这个就是手动将对象放到池中),多已经将对象放到了这个pool中 我们只要在不行要的时候调用【pool release】 就能清除内存。
所以我们看到
person release];
而不需要我们手动去释放 data 和person2两个对象、