0

これがデモンストレーションする疑似クラスです:

myView : UIView


- (void) init {

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

    return self;
}

ARCでは、myViewへの他のすべての参照が削除されたときにメモリを正しく解放するために、他に何かする必要がありますか?2つのオブジェクト間の参照により、介入なしでオブジェクトが永久に保持されますか?

これは、スクローラーがクラスプロパティであるかどうか、または関数で宣言されたローカル変数であるかどうかによって変わりますか?


いくつかのクラスの複数のインスタンスが存在してはならない理由を見つけようとしているだけです-半関連の質問ですが、オブジェクトがメモリに残っている理由を見つける簡単な方法があります(たとえば、このオブジェクトへのすべての参照を参照してください) )?

4

1 に答える 1

1

iOS クラス (UIScrollViewや などUIWebView) は、すでにこれを正しく処理しています。

ただし、独自のデリゲート プロトコルとデリゲート プロパティがある場合は、それらが割り当てられ、保持されないように設定されていることを確認する必要があります。これを行うには、デリゲート (または任意の種類のプロトコル) を宣言するたびに、__unsafe_unretained タグを追加する必要があります。

@protocol FooBarDelegate {
//...
}

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

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

これは、スクローラーがクラス プロパティであるか、関数で宣言された単なるローカル変数であるかによって変わりますか?

そうではありません。ただし、サブビューとして何かを追加すると、プロパティがあるかどうかに関係なく、親ビューはそれを自動的に保持することに注意してください。

于 2013-01-14T12:39:28.310 に答える