1

私が取り組んでいる、ARCiOS 4.3 および iOS 5 を使用し、サポートする必要があるアプリケーションは、ファイル内で everyoutletを宣言します。@property (strong, nonatomic) IBOutlet.h

例えば

// myClass.h
@property (strong, nonatomic) IBOutlet UITextView *myTextview;

オブジェクトへの参照を保持していないARCプロパティのみが解放されることを知っています。その結果、アプリは に依存してプロパティをに設定します。strong- (void)viewDidUnloadmyTextviewnil

すなわち

// myClass.m

- (void)viewDidUnload
{ 
[super viewDidUnload];
self.myTextview = nil;  
}

Apple のドキュメンテーションから、それOutletsは通常、ファイルの所有者 (つまり、iOS ストーリーボード シーンのコンテンツを所有する A) から(私の経験則では、ファイルの所有者、ファーストレスポンダーでウィンドウに表示されるものをすべて使用することです) をweak 除く必要があります。および表示)。Runtime ObjectTop-Level Objects

に追加するものはすべて にviewなるため、それsubviewはです。つまり、参照を使用する必要があります。retaineddirect superviewweak

- (void)viewDidUnloadまた、iOS 6 で廃止され、呼び出されないことも認識しています。

第 1 の質問: すべてのアウトレットをstrongプロパティとして宣言し、それをnilinに設定するというアプローチを取ることの問題は何ですか? iOS 6 で廃止されviewDidUnloadたという事実は別として?viewDidUnload

が呼び出されるnil前にへのポインターを設定できる状況が発生するためだと直感的にわかります。viewDidUnloadしたがって、ヒープ上のメモリを解放する必要があります。この場合、顕著なパフォーマンスの変化はありますか?

2 番目の質問: プロジェクト全体に戻って、に変更strongする必要がありweakますか? なんで?時間をかける価値はありますか?

3番目の質問property:を aで宣言しclass extensionて「隠す」場合、 or をいつ使用するかを決定するための経験則にどのように影響しますstrongweak

ここには、この問題について話し合うスレッドがたくさんあることを知っています。しかし、私が見つけた多くは時代遅れであり、この問題に直接対処していません。ありがとう。

4

2 に答える 2

0

1 番目の質問:アウトレットは、View Controller のプロパティであるメイン ビューのサブビューです。として宣言するとweak、サブビューであるため、保持カウントは 1 になります。ビューが解放されると、ビューも解放されます。それらを として宣言するとstrong、それらはサブビューであり、View Controller の強力なプロパティであるため、保持カウントは 2 になります。そのため、ビュー コントローラーが解放されたときにのみ解放されます (ビューとサブビューも解放されます)。私の理解では、違いは、View Controllerのビューが解放されたとき、たとえばそれが表示されておらず、メモリが少ない場合、アウトレットが として宣言されている場合でもメモリを割り当てることstrongです。
2 番目の質問:ほとんどの場合、それは問題ではないと思います。
3 番目の質問:クラス拡張でプロパティを宣言する場合、単にクラスに属しているため、「実際の」クラス プロパティと比較してそれらの処理に違いはありません。
私のアプローチは、保持サイクルが発生する可能性があるため、プロパティを宣言しないようにすることです。strongつまり、デリゲートを として宣言するとどうなりますかstrong

于 2013-05-02T16:14:09.020 に答える