1

ViewControllerにボタンなどのアイテムを表示するときは、ヘッダーファイルで宣言します。

@property (nonatomic, strong) UIButton *startButton;

実装ファイルで合成します。

@synthesize startButton;

実装ファイルで開始します。

startButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

そして、viewDidUnloadで参照をnilに設定します。

[self setStartButton:nil];

ただし、 viewDidLoad(Core Dataから供給)にループで動的に作成される60個のリストされたアイテム(UIScrollView内)がある場合はどうなりますか?(アイテムは非常に複雑でインタラクティブであるため、TableViewを使用しません。)

最初にどこかでアイテムを宣言する必要がありますか?どこでもnilに設定する必要がありますか?(または、指を交差させたままアークに祈る必要がありますか?)

いくつかのガイダンスをいただければ幸いです。ありがとう。

4

3 に答える 3

5

ビューコントローラには、これらの60個のアイテムのそれぞれを指すプロパティまたはインスタンス変数がありますか?

はい:次に、これらのivarまたはプロパティをnilに設定します-viewDidUnload

いいえ:心配することは何もありません。

ARCはメモリを管理するために行うことを変更しますが、基本的な哲学は変更されません。つまり、すべてのオブジェクトは他のオブジェクトへの独自の参照を処理する必要がありますが、他のオブジェクトの参照については心配しません。

この場合、これらすべてのアイテムを含むビューには、アイテムへの強力な参照が含まれます(サブビューの配列を介して)。ビューコントローラがビューを解放すると、そのビューの割り当てが解除され、プロセス内のすべてのサブビューが解放されます。したがって、これらのアイテムはすべて処理されます。これらのアイテムのいずれかへの強い参照がある場合、それらの参照により、参照されるオブジェクトの割り当てが解除されなくなります。参照をnilに設定すると、それが回避されます。

于 2012-07-18T13:59:30.897 に答える
1

これらのビューをその場で作成し、scrollViewのサブビューとして追加する場合は、他に何もする必要はありません。

の間にscrollViewを解放する-viewDidUnloadと、すべてのサブビューが適切にクリーンアップされます。


アップデート

このように考えてください。ストーリーボードの通常のビュー設定では、すべてのビューにプロパティを設定する必要はなく、コントローラが操作するビューのみを設定します。これは基本的に同じことです。スーパービューに埋め込まれているビューがたくさんあります。コントローラがそれらと相互作用しない場合は、それらについて心配する必要はありません。

于 2012-07-18T13:55:55.947 に答える
0

番号。:)

を使用している場合は、allポインタをnil 不要になったものARCに確実に設定します。

オブジェクトを存続させようとするポインタARCがなくなると、は現在のオブジェクトのメモリを解放します。それらをまだ使用していると思われるようにstrong設定しないとnil、それらはメモリ内に存在し、深刻なメモリリークを引き起こします。ARC

更新#1

ボタンの参照がある場合、これが最も簡単な方法です。ボタンのクラスであり、ボタンから削除する必要があるnilため、何にも設定する必要はありません。superviewretainsuperview

for (UIView *_subView in self.view.subviews) {
    if ([_subView isKindOfClass:[UIButton class]]) {
        [_subView removeFromSuperview];
    }
}

それらのポインタを他の場所(たとえばNSArray)に格納している場合は、それらからもポインタを削除する必要があります。

于 2012-07-18T13:47:31.083 に答える