ARC:将自己设定为班级成员的代表会阻止自己被释放吗?

时间:2013-01-14 12:32:50

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

这是一个伪类来演示:

myView : UIView


- (void) init {

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

    return self;
}

在ARC下,当删除对myView的所有其他引用时,是否还需要执行其他操作才能正确释放内存?两个物体之间的参考是否会让它们永久地粘在一起而不需要任何干预?

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


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

1 个答案:

答案 0 :(得分:1)

iOS类(如UIScrollViewUIWebView)已正确处理此问题。

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

@protocol FooBarDelegate {
//...
}

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

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

这是否会根据滚动条是否为类而发生变化   property,还是只是在函数中声明的局部变量?

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