0

ARCオプションを有効にしたiPhoneアプリを開発しています。ファイル所有者アイコンから.xib要素に接続されている.hファイルにIBOutletsを作成しています。

IBOutlet UIButton *bt;
@property(nonatomic,retain)IBOutlet UIButton *bt;

.mファイルで、私はやっています

@synthesize bt;

btメソッドで明示的にnilに設定する必要がありviewDidUnloadますか?つまり?self.bt = nil;_viewDidUnload

deallocまた、 ARCオプションを有効にしてメソッドを作成する必要がありますか?ARCを有効にして、IBOutlets要素を強参照と弱参照としていつ作成する必要がありますか?

4

2 に答える 2

2

アウトレットを nil にする必要があることviewDidUnloadと、dealloc

ARC があるということは、メソッドにそれを記述する必要がないことを意味しますdealloc(自動的に行われます) が、このviewDidUnloadメソッドには別の目的があり、メモリ警告が発生したときにアプリケーションが使用していないメモリを解放することです。 deallocたとえば、クラスが通知用に登録されている場合や、クラスが他の誰かのデリゲートであり、不正なアクセスを与えるグリッチのあるコールバックが望ましくない場合など、場合によってはまだ必要です

メモリ警告UIViewControllersが表示されると、表示されていないすべてのビューがアンロードされ、そのメソッドが呼び出されてメモリが解放されます。アウトレット (ボタン、テーブルなど) をまだ保持している場合、それらは解放されないため、viewDidUnload メソッドの目的が失われます。

于 2012-08-30T19:36:28.187 に答える
2

ARC を使用する場合、たとえばretainやなどの修飾子を使用する必要はありません。この種のメモリ管理は、修飾子と修飾子copyを使用して自動的に行われます。strongweak

deallocメソッドの記述についても心配する必要はありません。

strongは と同じようなものなretainので、アウトレットをそれでマークする必要があります

@property(nonatomic, strong) IBOutlet UIButton *bt;

これが、インターフェイス ビルダーがデフォルトで作成する方法です。

それらのセマンティックの違いについては詳しく説明しませんが、何が起こっているのかを知りたい場合や修飾子の詳細について知りたい場合は、 Apple の ARC への移行に関するガイドを参照してください。strongweak

編集: 申し訳ありませんが、インターフェースビルダーはweakデフォルトでアウトレットを作成します。

編集 2: strong実際にretainは 100% 同一です。(@アダムに感謝)

EDIT 3:エラーが発生nilしないようにmessage sent to deallocated instanceポインタ を設定します。BAD_ACCESS_EXCEPTION

実際に ARC を使用している場合は、 の(nonatomic, weak)代わりにアウトレットを作成する必要があります(nonatomic, strong)。ゼロ化ポインターを使用することにより、コンパイラーは、他に何も参照されていないときにweakアウトレットを自動的に設定します。nil

要約すると、プロパティを使用しない場合は、ポインタを nil に設定する必要があります。weak

于 2012-08-30T19:39:12.410 に答える