Iphone ARC:将self设置为类成员';s代表阻止self被释放?

Iphone ARC:将self设置为类成员';s代表阻止self被释放?,iphone,ios,objective-c,ipad,automatic-ref-counting,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的所有其他引用都被删除时,我是否还需要做其他事情才能正确释放内存?两个对象之间的引用是否会

下面是一个伪类来演示:

myView : UIView


- (void) init {

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

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

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


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

iOS类(比如
UIScrollView
UIWebView
)已经正确处理了

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

@protocol FooBarDelegate {
//...
}

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

@property (nonatomic, assign) id <FooBarDelegate> delegate;
@protocolfoobardelegate{
//...
}
@接口Foo:Bar{
__不安全的\u未保留的id代表;
}
@属性(非原子,赋值)id委托;
这是否取决于scroller是否为类而改变 属性,还是只在函数中声明局部变量


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

不安全的未恢复用于保持与较低iOS的兼容性,当目标为5及以上时,应将其设置为弱,以保持一致性。(有点像,但名字更漂亮)不完全一样。更安全。“\uuuu unsafe\u unretained”的名称中有“unsafe”的原因。
unsafe
的原因是它不是保留的属性,如果你的应用程序内存管理不好,该对象可能会被释放,但该属性仍然指向该位置,这可能会导致崩溃。但是,这完全是编程错误,这同样适用于
参考。