3

Let's say I want to create a temporary variable, e.g.:

  1. To point to another long-living variable:

    __unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
    
  2. To point to an object I just created.

    __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
    

These temporary variables don't need to be retained because the objects they point to are guaranteed to keep positive retain counts for as long as the temporary variables are in scope. So, should I declare them as __unsafe_unretained?

4

3 に答える 3

5

Why does it matter if the system retains your temp variable? And as a matter of fact, you DO want to retain it.

Consider:

__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView
self.tableView.tableHeaderView = nil;
NSLog(@"%@", tableHeaderView); //<-I WILL CRASH
于 2012-01-26T15:09:25.957 に答える
2

マット、

ARC の要点は、この種の問題を無視できるようにすることです。実際、コンパイラはこれらのインスタンスを保持さえしない場合があります。

これらの問題は ARC にお任せください。コンパイラーまたは静的アナライザーが文句を言うまで、助けようとしないでください。(ところで、コンパイルごとにアナライザーを実行させていますよね? 問題を作成すると、問題が検出されます。)

ループでの余分なオブジェクトの作成と、大きなオブジェクトの作成の管理についてのみ心配する必要があります。前者は の賢明な使用によって処理されます@autorelease。以前の ARC と同じように、大きなアイテムを引き続き管理します。

アンドリュー

于 2012-01-27T14:47:39.443 に答える
1

いいえ。ARC がそれを保持する場合、変数が範囲外になると手放されます。

于 2012-01-26T15:09:23.480 に答える