Objective-C-弱性质-getter自动释放(自动参考计数)

Objective-C-弱性质-getter自动释放(自动参考计数),objective-c,automatic-ref-counting,getter,autorelease,weak-references,Objective C,Automatic Ref Counting,Getter,Autorelease,Weak References,我对ARC中的弱属性(自动参考计数)有疑问 我的理解(如果我错了,请纠正我): a1 = 0x10d713f50 --- end of block 1 --- end of autoreleasepool 1 instance of A deallocated = 0x10d713f50 ---- end of main instance of B deallocated = 0x10d713d30 a1 = 0x10d713f50 --- end of blo

我对ARC中的
属性(自动参考计数)有疑问

我的理解(如果我错了,请纠正我):

    a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
    instance of A deallocated = 0x10d713f50
---- end of main
    instance of B deallocated = 0x10d713d30
    a1 = 0x10d713f50
--- end of block 1
    instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
    instance of B deallocated = 0x10d713d30
weak
属性的行为类似于
assign
属性,只是当属性指向的实例被销毁时,ivar会指向nil

问题:

    a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
    instance of A deallocated = 0x10d713f50
---- end of main
    instance of B deallocated = 0x10d713d30
    a1 = 0x10d713f50
--- end of block 1
    instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
    instance of B deallocated = 0x10d713d30
  • 我只是觉得
    弱属性的getter保留和自动删除。它的行为不应该像
    assign
    属性的getter一样,getter不保留和自动释放吗?(请参考程序)
  • 节目:

        a1 = 0x10d713f50
    --- end of block 1
    --- end of autoreleasepool 1
        instance of A deallocated = 0x10d713f50
    ---- end of main
        instance of B deallocated = 0x10d713d30
    
        a1 = 0x10d713f50
    --- end of block 1
        instance of A deallocated = 0x10d713f50
    --- end of autoreleasepool 1
    ---- end of main
        instance of B deallocated = 0x10d713d30
    
    我在下面给出了实际输出和预期输出的程序

    注意-当我将属性从
    更改为
    分配
    时,我的预期输出得到满足

    我的预期输出:

        a1 = 0x10d713f50
    --- end of block 1
    --- end of autoreleasepool 1
        instance of A deallocated = 0x10d713f50
    ---- end of main
        instance of B deallocated = 0x10d713d30
    
        a1 = 0x10d713f50
    --- end of block 1
        instance of A deallocated = 0x10d713f50
    --- end of autoreleasepool 1
    ---- end of main
        instance of B deallocated = 0x10d713d30
    

    感谢在属性上提供
    假设ivar的所有权为
    \uu弱
    ,即它只是
    @synthesis
    的指令

    根据§4.2,读取
    \uu弱
    变量需要保留对象(当然,在以下情况下释放):

    在对对象左值执行左值到右值的转换时发生读取

    • 对于_弱对象,将保留当前指针对象,然后在当前完整表达式的末尾释放。这必须在指针对象的赋值和最终发布时以原子方式执行
    • 对于所有其他对象,左值都加载了基本语义
    它没有说明原因,但想想如果你从_弱变量得到的对象在你开始使用它之前就死了会发生什么。弱指针的目的是确保您拥有
    nil
    或具有已知生存期的有效对象,这就是为什么读取其值意味着保留指针对象(然后属性的getter返回autoreleased)


    这不是Obj-C所独有的,它是所有弱指针实现(refcounted和垃圾收集)的通用习惯用法。弱指针不能直接给出指针值,它们必须创建指向“hold”对象的强指针,以确保在调用方开始使用它之前它不会死掉。在Obj-C中,它是保留自动释放;在C++中,最先创建的是SydDypTR,在垃圾收集环境中,返回一个强引用,并且对象的生命周期被延长。
    function -[B xa1] {
        var_8 = rdi;
        var_0 = rsi;
        rdi = objc_loadWeakRetained(var_8 + *_OBJC_IVAR_$_B.xa1);
        rax = [rdi autorelease];
        return rax;
    }
    
    所以当你得到财产的时候

    A* a3 = b1.xa1;
    

    a1==b1.xa1获得自动释放呼叫并由自动释放池保留

    谢谢回复,我有疑问。如果我错了,请纠正我-使用弱属性的目的是确保寿命不会增加,只要所有者不破坏它,就可以使用它。如果要延长生存期,使用弱指针不是有违目的吗?@user1046037我已经更新了我的答案,其中有一个指向ARC规范的链接,明确记录了这种行为。@user1046037
    属性上的弱
    只是
    @synthesis
    的指令。您观察到的行为是由于
    \uu-weak
    读取语义造成的:您不能将weak转换为
    不安全的\u-unretained
    指向某个对象的指针,因为它的生命周期可以随时结束,您必须在使用它之前保留该对象。我觉得[bar dosomethingthatsdestroysfoo]除非包括fooPtr在内的所有所有者都超出范围,否则无法销毁fooPtr指向的实例。@user1046037这可能不是一个好例子。我们可以说,由方法(getter)返回的对象必须至少将其生存期延长到当前作用域的末尾,而对于弱指针,如果不先保留它们,它将不为真。