質問

しばらくの間、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;委任

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top