3

は例えば、のは、私は一時変数を作成したいとしましょう。:一時変数に__unsafe_unretainedを使用する必要がありますか?

  1. 別の長寿の変数を指すように:私はちょうど作成したオブジェクトを指すように

    __unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView; 
    
  2. __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init]; 
    

これらの一時変数は、彼らが指すオブジェクトがある限り、一時的な変数がスコープ内にあるとするためにカウントを保持ポジティブに保つことが保証されているので、保持する必要はありません。だから、私はそれらを__unsafe_unretainedと宣言すべきですか?

+1

ジョシュアとゾールが言ったこと。余分な保持/解放からのヒットは、あなたが得る問題の予防にとっては重要ではありません。 – Wevah

答えて

1

いいえARCが保持している場合は、変数が有効範​​囲外になったときに解放されます。

5

システムで一時変数が保持されるのはなぜですか?実際、あなたはそれを保持したいと思います。

は考えてみましょう:

__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView 
self.tableView.tableHeaderView = nil; 
NSLog(@"%@", tableHeaderView); //<-I WILL CRASH 
+0

パフォーマンス上の理由からです。コンパイラは、それが必要ない場合には、一時変数を保持しないほどスマートでなければならないようです。 – ma11hew28

+2

それは合理的に知ることはできません。そこに直接nilを設定するのではなく、長時間の一連のイベントを引き起こした別のメソッドを呼び出して、tableHeaderViewが解放されたらどうなるでしょうか?また、事前に最適化しています。オブジェクトを保持することがパフォーマンスにとって最重要事項である場合は、他にもたくさんのことをしています。オブジェクトの所有権があなたのチョークポイントになることはありません。 –

2

マット、

ARCの全体のポイントは、あなたが問題のこれらの種類を無視するようにすることです。実際、コンパイラはこれらのインスタンスを保持することさえできないことがあります。

これらの問題についてARCに心配しましょう。コンパイラやスタティックアナライザーが不平を言うまでそれを助けようとしないでください。

ループ内の余分なオブジェクトの作成と大きなオブジェクトの作成の管理について心配する必要があります。これは、コンパイル時に問題が発生することを意味します。前者は、@autoreleaseを賢明に使用して処理されます。前のARCと同じように、大きなアイテムは引き続き管理します。

アンドリュー

関連する問題