这是我的代码
__weak KDObject *obj = [KDObject fetchObj] ;
NSLog(@"%@", obj) ; // I think it should be nil, but it is not
obj.i = 10 ;
NSLog(@"%d", obj.i) ;
在
KDObject.m
中@implementation KDObject
+ (instancetype)fetchObj
{
return [[self alloc] init] ;
}
@end
无论使用
-fno-objc-arc
标志还是不使用-fno-objc-arc
标志编译KDOjbect.m,结果都是相同的有人知道为什么
obj
不为零吗? 最佳答案
与您的问题和答案有关:
-fectchObject是不属于任何具有所有权转移的方法族的方法。因此,ARC必须确保返回参考是安全的。这意味着在-fetchObject的本地范围内丢失强引用不会放弃最后一个引用。
实现此目的的一种方法是使用自动释放池。但是ARC不保证使用ARP。此外,它尝试不使用ARP,因为这是具有最高内存压力的解决方案。
因此,发生的事情取决于编译器的实现,方法的属性设置以及编译器在源代码中看到的内容(尤其是-fetchObject的实现)。因此,您不应该依赖于返回ARP。
如果对象被销毁,则__weak保证为nil。但是,不能保证物体在尽可能短的时间内被破坏。这是优化的主题。