关于weak对象什么时候释放
utorelase对象
按照苹果的编程约定,由非alloc
,copy
返回的对象都是autorelease
的,所以对于以下代码,虽然变量number
是__weak
的,但是由于[NSNumber numberWithInt:100]
返回的对象是autorelase
的,所以仍然能通过NSLog打印出来。
1
2
|
__weak NSNumber *number = [NSNumber numberWithInt:100]; NSLog(@"number = %@", number); |
从汇编代码中看,以上代码在创建number
变量时,是通过objc_loadWeak
方法进行的。而根据 Clang的官方文档,objc_loadWeak
方法会retain
并autorelease
这个对象。所以给一个weak对象赋值,它并不会马上释放,而是会放到autorelease pool
中,与autorelease pool
一起释放。
如下是objc_loadWeak
的代码示例:
1
2
3
|
id objc_loadWeak(id *object) { return objc_autorelease(objc_loadWeakRetained(object)); } |