一:局部对象
我们在viewDidLoad中添加People *p = [People new]; NSLog(@"%s",__FUNCTION__);
打印结果为:
2015-10-19 13:16:10.589 textarc[2627:93432] -[People init]
2015-10-19 13:16:10.600 textarc[2627:93432] -[ViewController viewDidLoad]
2015-10-19 13:16:10.600 textarc[2627:93432] -[People dealloc]
我们发现People这个对象别释放,从打印顺序上我们可以看到是在viewDidLoad执行完毕之后这个People对象被释放掉的。
局部对象为什么会在函数执行完毕之后被释放掉呢?
在viewDidLoad中,p是一个强引用,对象不会被释放,会打印NSLog中的内容。但是在函数执行完毕之后,强引用指针不在指向对象。根据上面的准则,没有强指针指向对象会被立刻释放,所以在执行完viewDidLoad之后,对象People会被释放掉。
如果我们在viewDidLoad中这样写:
__weak People *p = [People new];
NSLog(@"%s",__FUNCTION__);
我们可以猜测到打印结果就会跟上面的不同
2015-10-19 13:22:10.783 textarc[2682:96983] -[People init]
2015-10-19 13:22:10.783 textarc[2682:96983] -[People dealloc]
2015-10-19 13:22:10.784 textarc[2682:96983] -[ViewController viewDidLoad]
因为对象没有强指针引用,所以People会被释放,然后执行下面的打印。