这是我的代码

__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。但是,不能保证物体在尽可能短的时间内被破坏。这是优化的主题。

10-08 07:29