は、私たちは以下のように見えるいくつかのコードを持っているとしましょう:私はプロパティを保持するように設定しましたが、autoreleaseに設定されていても解放するはずですか?
@interface SomeClass : NSObject
@property (nonatomic, retain) NSString *someString;
@end
@implementation SomeClass
@synthesize someString;
-(id)init {
if (self=[super init]) {
someString = [NSString stringWithString:@"some string"];
}
return self;
}
@end
私はsomeString
が自動解放するように設定した場合でも、SomeClass
のdeallocメソッドでsomeString
プロパティをリリースすることになって、私は実際にそれを保持することはありませんアム私のinit
方法?その場合は、-release
メソッドで[super dealloc]
の前に[someString release]
を追加するだけです。正しい?
今私が抱えている問題は、Cocos2Dを使用しているときに矛盾する状況に遭遇したことです。
@interface SomeLayer : CCLayer
@property (nonatomic, retain) CCSprite *someSprite;
@end
@implementation SomeLayer
@synthesize someSprite;
-(id)init {
if (self=[super init]) {
someSprite = [CCSprite spriteWithFile:@"SomeFile.png"];
[self addChild:someSprite];
}
return self;
}
@end
は今、私は私の層SomeLayer
に子としてsomeSprite
を追加しました:私のコードは次のようになります。だから、私はここにメモリリークがないことを確認するために何をすべきですか?私は、次のものを考えることができます:
- もちろん、私は
SomeLayer
さん-dealloc
方法で[someSprite release]
を呼び出すと思うだろう。それはを[super dealloc]
(次の行)に与えます。私は子供を削除していないため、スーパークラスは今リリースしたばかりの子供にアクセスしようとしています。 -dealloc
メソッドで[self removeChild:someSprite cleanup:YES]
メソッドを呼び出すと、子を削除して解放します。だから私は[someSprite release]
とフォローアップする必要はありません。しかし、ねえ、-dealloc
スーパークラスCCNode
のメソッドはすでに私のためにすべてを行います。- 私は何もしません。私は
-dealloc
メソッドをオーバーライドしません。これはうまくいくようですが、「あなたが何かを保持していれば、それを解放するはずです」と声明と矛盾しています。
なぜ私はケースIでオブジェクトをリリースしなければならないかについての助けと、初期段階のケースIIで、長期間に渡って多くのメモリ関連の問題を軽減するのに役立つ。
おかげ
再び良いだろう。基本的な '@ synthesize'コードは私のためのプロパティを保持し、' -dealloc'メソッドで解放することができます。 Good to go :) – Himanshu