关于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方法会retainautorelease这个对象。所以给一个weak对象赋值,它并不会马上释放,而是会放到autorelease pool中,与autorelease pool一起释放。

如下是objc_loadWeak的代码示例:

1
2
3
id objc_loadWeak(id *object) {
  return objc_autorelease(objc_loadWeakRetained(object));
}
原文地址:https://www.cnblogs.com/canghaixiaoyuer/p/5383333.html