【问题标题】:ARC: Will setting self as a class member's delegate stop self from ever being freed?ARC:将 self 设置为班级成员的代表会阻止 self 被释放吗?
【发布时间】:2012-12-28 09:57:41
【问题描述】:

这里有一个伪类来演示:

myView : UIView


- (void) init {

    UIScrollView * scroller = [[UIScrollView alloc] init];
    scroller.delegate = self;
    [myView addSubview:scroller];

    return self;
}

在 ARC 下,当所有其他对 myView 的引用都被删除后,我是否需要做任何其他事情才能正确释放内存?两个对象之间的引用会让它们在没有任何干预的情况下永远存在吗?

这种变化是否取决于滚动条是类属性,还是只是函数中声明的局部变量?


只是想找出为什么我有一些不应该存在的类的多个实例存在 - 半相关的问题,是否有一种简单的方法可以找出对象留在内存中的原因(例如查看所有引用到这个对象)?

【问题讨论】:

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


    【解决方案1】:

    iOS 类(如 UIScrollViewUIWebView)已经正确处理了这个问题。

    但是,如果您有自己的委托协议和委托属性,则需要确保将它们设置为分配而不是保留。为此,无论您在何处声明委托(或任何类型的协议),都需要添加 __unsafe_unretained 标记:

    @protocol FooBarDelegate {
    //...
    }
    
    @interface Foo : Bar {
        __unsafe_unretained id <FooBarDelegate> delegate;
    }
    
    @property (nonatomic, assign) id <FooBarDelegate> delegate;
    

    是否会根据滚动条是否为类而改变 属性,还是只是函数中声明的局部变量?

    它没有。但是请记住,添加某些内容作为子视图,父视图将自动保留它,无论您是否有属性。

    【讨论】:

    • unsafe unretained 用于保持与较低 iOS 的兼容性,当瞄准 5 及更高版本时,应将其设置为弱以保持一致性。 (有点相似,但名字更漂亮)
    • 不完全一样。安全多了。 “__unsafe_unretained” 的名称中有“不安全”是有原因的。
    • unsafe 的原因是它不是保留属性,如果您的应用程序内存管理不善,则该对象可能会被释放但该属性仍指向该位置,这可能导致崩溃。但是,这完全是一个编程错误,weak 引用也是如此。
    猜你喜欢
    • 2021-11-03
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多