1

にリリース:のObjective-C:1つのスレッドでの割り当てと私は私のメインスレッドでこれをやっている

CCAnimation *anim; //class variable 

[NSThread detachNewThreadSelector:@selector(loadAimation) toTarget:self withObject:nil]; 

loadAimationで:

-(void) loadAnimation { 
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 
     anim = [[CCAnimaton alloc] init]; 
     [autoreleasepool drain]; 
} 

を、メインスレッドで、私はそれを解放:

 [anim release]; 

ここで、メモリ管理に関してこれが問題ではないかと尋ねたいと思います。

+0

'loadAimation'は' loadAnimation'ですか?なぜ、 'anim'はプロパティではなくクラス変数ですか?リリースのコードは何ですか?オブジェクトの作成と破壊がバランス良く行われているかどうかを判断するのに十分な情報はありません。 – outis

+0

はい、あなたは問題が本当にリリースの周りで起こっていると思います(私はこれがうまくいくかどうか尋ねたがっています)。実際にはリリース前のcocos2dに関連しています。私はCCActionを作成していますが、CCSprite * spを持っています。単に[sp runAction:anim]を実行しています。アニメーションが実行されている間、私はそれをリリースしていますが、アニメーションは視覚的に何も起こりませんが、それは正しいですか? – Asymptote

+0

すべての実装方法によって異なります。所有権を取得するオブジェクトは、アニメーションを保持します。オブジェクトが所有権を取得しない場合、アニメーションは保持されません。 cocos2dドキュメントのオーナーシップルールを確認してください。それでも、メモリ管理の問題を引き起こす[競合状態](http://en.wikipedia.org/wiki/Race_condition)に陥る可能性があります(例えば、所有オブジェクトがオブジェクトを保持する前にアニメーションが1つのスレッドで解放される別のスレッド)。 – outis

答えて

0

もちろん、ポインタ変数へのアクセスを保護している場合は、問題ありません。

1

オブジェクトをあるスレッドに割り当てて、別のスレッドに割り当てを解除することは可能です。しかし、あなたがそれに近づく方法によっては、コードが間違って行うことができます。

可能であれば、animをプロパティに変えて、メモリ管理についてあまり心配する必要はありません。できない場合はアクセサーパターンを適用できますが、それを自分で実装する必要があります。

static CCAnimation *anim=nil; 

+(CCAnimation*)anim { 
    @synchronized(self) { 
     return [[anim retain] autorelease]; 
    } 
} 
+(void)setAnim:(CCAnimation*)animation { 
    @synchronized(self) { 
     if (anim != animation) { 
      [anim release]; 
      anim = [animation retain]; 
     } 
    } 
} 
-(void)loadAnimation { 
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 
    [[self class] setAnim:[[[CCAnimaton alloc] init] autorelease]]; 
    [autoreleasepool drain]; 
} 
+0

標準的なsetter/getterを実装するために '@synchronize(self) 'しないでください。 @property()と@synthesizeを使用します。結果はより速く、正しいことが保証されます(上記は間違っているわけではありませんが、なぜコンパイラがあなたのために書くことができるコードを書くのですか?)。 – bbum

+0

@bbum:これはあなたの標準アクセサではなく、 'anim'は(インスタンス)プロパティではないからです。メソッドの前に '+'があることに注意してください。 'anim'はクラスプロパティで、アップルのコンパイラはあなたのために生成しません(ただし、ドットシンタックスをサポートしているようです)。マルチスレッドを扱う際には、getterとsetterの '@ synchronize'が非常に必要です。 – outis

+0

Derp。うん、すみません。 '+'が見つかりませんでした。返品方法が間違っていることに注意してください。あなたが正しくアトミックにしたいならば、ローカルスレッドの 'anim'の寿命が正しいセマンティクスに従うことを保証するために' '[[anim retain] autorelease];を返すべきです(実際に@synthesizeはw /インスタンスの場合は標準アクセサー)。 – bbum

関連する問題