这是我的代码
__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
无论KDOjbect.m是使用-fno-objc-arc
标志编译还是没有-fno-objc-arc
标志
任何人都知道为什么obj
不是零?
答案 0 :(得分:2)
与您的答案相关的问题和:
-fectchObject是一种不属于具有所有权转移的任何方法系列的方法。因此ARC必须确保返回参考是安全的。这意味着丢失-fetchObject的本地范围中的强引用不会放弃最后一个引用。
实现此目的的一种方法是使用自动释放池。但ARC并不保证使用ARP。此外,它尝试不使用ARP,因为它是具有最高内存压力的解决方案。
所以发生的事情取决于编译器实现,设置到方法的属性以及编译器在源代码中看到的内容(特别是-fetchObject的实现)。所以你不应该依赖ARP返回。
如果对象被破坏,__ weak保证为nil。但是不能保证物体在最早的时刻被破坏。这是优化的主题。
答案 1 :(得分:0)
来自__weak
的文档__ weak指定不使引用对象保持活动状态的引用。当没有强弱时,弱引用设置为nil 对象的引用。
是否__weak或KDObject *o = [[KDObject alloc] init]
创建了一个对象,因此o
不是零。
__ weak是与内存管理相关的东西。如果没有强对象指向weak
对象,它将从内存中释放。
答案 2 :(得分:-1)
- (void)loadView
{
[super loadView];
TestObject *obj_ = [[TestObject alloc] init];
pObj = obj_;
if(pObj == nil)
{
NSLog(@"pObj_ is not nil");
}
__weak TestObject *obj2_ = [[TestObject alloc] init];
if(obj2_ == nil)
{
NSLog(@"obj2_ is nil");
}
__weak TestObject *obj3_ = [TestObject createInstance];
if(obj3_ == nil)
{
NSLog(@"obj3_ is nil");
}
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(pObj == nil)
{
NSLog(@"pObj is nil");
}
}
KudoCC请求此代码。我使用LLVM5.1。如果我使用-fno-objc-arc到TestObject.h,那么objc3_就变成了零。