电弧和无电弧问题

时间:2014-07-01 08:02:34

标签: ios objective-c automatic-ref-counting

这是我的代码

__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不是零?

3 个答案:

答案 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_就变成了零。