IBOutlet オブジェクトを解放するメモリについてジレンマがあります。プロパティなしで IBOutlet オブジェクトを作成するときに何をすべきか誰か提案してください。それを解放する必要がありますか?? リリースする必要がある場合... なぜリリースするのか
8 に答える
答えはイエスです。
ランタイムは、オブジェクトをIBOutlet
usingに接続します[setValue:ForKey:]
。この関数は、プライベート インスタンス変数を見つけて、ターゲットを保持し、それをインスタンス変数に設定します。詳細については、こちらのiOS 開発者ライブラリにアクセスしてください。
多くの iOS フレームワークは、getter/setter/instance 変数を直接呼び出すのではなく、 Key-Value コンプライアンス ([setValue:ForKey:]
または) によってプロパティにアクセスするため、この記事を読むことを強くお勧めします。[valueForKey:]
あなたはそのオブジェクトの所有者ではありません。したがって、IBOutlet オブジェクトを解放する必要はありません。IBoutlet オブジェクトで @property (非アトミック、保持) を使用している場合は、dealloc でそのオブジェクトを解放する必要があります。
Advanced Memory Management Programming Guideを参照してください
。所有していないオブジェクトの所有権を放棄してはなりません。
物事をより明確かつ明確にするために、プライベート IBOutlet プロパティを持たない理由はありません。私はいつもこれを個人的に行います:
MyClassName.m
@interface MyClassName ()
@property (nonatomic, weak) IBOutlet NSObject *myPropertyNameForAnOutlet;
@end
@implementation MyClassName
...
@end
答えはイエスです...
私もそれについて混乱しましたが、これを試してください:
xibファイルを開く
アシスタント エディター ウィンドウを開いて、XIB IB ファイルの近くにある .h ファイル コードを取得します。
IB ファイル内のオブジェクトを選択しました (var への参照を持たないオブジェクト)
Ctrl キーを押しながらクリックし、「新しいリファレンス アウトレット」ボタンを選択しました。
@interface{ } セクションの .h コード ファイルに行をドラッグします。
新しい var に名前を付けます ("aaa")
(プロパティ「aaa」は作成されないことに注意してください)
これで、Xcode がすべての魔法を実行してくれます。
.m ファイルで、dealloc メソッドで見つけることができます。
- (void) dealloc {
[aaa release];
[super dealloc];
}
だから...アップルがそれをリリースした場合、XIBファイルを介してロードされたデフォルトのIBOutlet変数が保持されているようです...
編集:
Apple docのポイントは次のとおりです。
IBOutlet
プロパティの所有権のセマンティクスは変更しません。ARC を使用しない場合は、他のプロパティと同様に、保持されたオブジェクトを解放する必要があります。
デフォルトの「弱い」に設定するだけです。その後、ARCで問題ありません。
あなたはオブジェクトの所有者ではないため、オブジェクトを解放しません。
オブジェクトを保持、コピー、または作成 (init/alloc) することで所有者になります。その場合にのみ、あなたはオブジェクトの所有者 (の 1 人) になり、オブジェクトを使い終わったらそれを解放する必要があります。詳細については、 Cocoa のコア コンピテンシー - メモリ管理を確認してください。
オブジェクトを解放する必要がない理由がこれで説明できることを願っています。
プロパティとして設定していませんが、プロパティはsetterメソッドとgetterメソッドを参照しています。オブジェクトを使用するときは、常にそれを解放することを忘れないでください。このプロパティは、メモリの問題とは無関係です。