プロトコルである属性を解放する方法は?
-
05-07-2019 - |
質問
しばらくの間、iPhone開発に取り組んでいます。初めて、objective-cのメモリ管理にとても驚きました:)。でも今は少しわかりました。
質問は、クラスの属性としてプロトコルを使用する場合があります。その定義はC#またはJavaの「インターフェイス」に非常に似ていると思うからです。以下のように。
@protocol Shield
...
@end
// Interface
@interface Dragon {
id<Shield> shield
NSString * name;
}
@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;
@end
しかし、dealloc()メソッドの属性オブジェクトは常に解放しています。以下のように。
-(void)dealloc {
[name release];
[shield release]; // <--- Totally impossible. xcode said '-release not found in protocol'
[super dealloc];
}
ご覧のとおり、プロトコルをリリースできませんでした。だから、これは私に将来のメモリの問題を引き起こすでしょうか?この解決策に対処する別の方法がありますか?
解決
次のように、プロトコルをNSObject
プロトコルに準拠するように定義する必要があります。
@protocol Shield <NSObject>
...
@end
方法を知っていれば簡単です! ;-)
編集:また、あなたは正しいです-Objective-Cのプロトコルは、JavaおよびC#のインターフェースと同等です。
別の編集:これを行うと奇妙に感じるかもしれませんが、Objective-Cでは複数のルートオブジェクトが許可されるため、すべてのオブジェクトがrelease
から派生することを実際に保証することはできません。 <NSObject>
は<=>メソッドであるため、<=>メソッドに応答できることを確認するには、プロトコルを<=>プロトコルにも準拠するように定義する必要があります。
他のヒント
1- [シールドリリース]の代わりに行うべき適切な設定は設定です
self.shield = nil;
2-変更も
@property (nonatomic,retain) id<Shield> shield;
to
@property (nonatomic,assign) id<Shield> shield;
その後、元気です。
編集:
保持を避ける理由 デリゲートは、あなたが避ける必要があるということです 保持ループ:
AはBを作成しますAはBとして自身を設定します デリゲート<!>#8230; Aは所有者によってリリースされています
BがAを保持していた場合、Aは保持されません BがAを所有しているため、Aの deallocは呼び出されません。 AとBの両方がリークします。
Aが消える心配はないはずです b / cそれはBを所有しているため、それを取り除く deallocで。
なぜ客観的か-Cデリゲートは通常、retainの代わりにプロパティassignを指定しますか?
プロトコル宣言の例については、uitableviewクラスリファレンスをご覧ください:
@property(nonatomic、assign)id <!> lt; UITableViewDelegate <!> gt;委任