0

这是一个伪类来演示:

myView : UIView


- (void) init {

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

    return self;
}

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

这是否取决于 scroller 是类属性,还是只是函数中声明的局部变量?


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

4

1 回答 1

1

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

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

@protocol FooBarDelegate {
//...
}

@interface Foo : Bar {
    __unsafe_unretained id <FooBarDelegate> delegate;
}

@property (nonatomic, assign) id <FooBarDelegate> delegate;

这是否取决于 scroller 是类属性,还是只是函数中声明的局部变量?

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

于 2013-01-14T12:39:28.310 回答