2011-08-07 17 views
0

数回後に私のアプリがクラッシュする理由を知ることができません:問題の割り当てと解放

ポーションTは非原子的で、保持され、読み取り専用です。

-(void)First:(NSString*)Potions { 

    potionsT = [[NSString alloc] initWithString:Potions]; 
} 

-(void)After:(NSString*)Potions { 
    [potionsT release]; 
    potionsT = [[NSString alloc] initWithString:Potions]; 

私は最初に電話しています。最初とその後、私は数回電話しています:そして、それはクラッシュします。 ECX_BAD_ACCESSと一緒に。私はそのメモリ管理の事柄すべてにかなり戸惑っています。私はそれを知っています...ありがとう!

答えて

3

保持プロパティのポイントは、設定すると保持および解放を処理することです。

- (void)first:(NSString*)potions 
{ 
    self.potionsT = potions; // will automatically release old value and retain new 
} 

- (void)after:(NSString*)potions 
{ 
    self.potionsT = potions; // same as above 
} 

はまた私がafter:After:をごPotionspotionsからFirst:first:に名前を変更し、どのように注意してください。 Objective-Cの命名規則は、変数とメソッドを小文字で開始し、クラス名を大文字で開始することです。

+0

私はそれを試しましたが、それでもクラッシュします。 – Eli

+0

デバッガが言うか、またはより多くのコードのような、より詳細な情報があります... –

2

@synthesizeあなたはクラスの@implementationのプロパティですか?もしそうなら、あなたは使用する必要があります。

self.potionsT = Potions; 

あなたは

potionsT = ... 

を使用している場合、あなたはIVAR、ないプロパティにアクセスしています。このプロパティにアクセスしてメモリ管理を行うには、そのインスタンスの前にインスタンス参照を設定する必要があります。

プロパティを使用する場合は、プロパティがすでにあなたのために行っているので、potionsTを手動でリリースしないでください。

+0

ちょっと、私はそれを試みましたが、まだクラッシュします.. – Eli

+0

コードがクラッシュする理由はたくさんあります。なぜクラッシュするのかを知るためには、コードの多くを見なければなりません(どこで、どのように?)。デバッガを使用して、発生場所を特定します。 –

2

あなたがプロパティとしてpotionsTを設定している場合、あなたはそれをそのようにアクセスする必要があります。どちらの場合も

-(void)first:(NSString*)potions { 
    self.potionsT = potions; 
} 

-(void)after:(NSString*)potions { 
    self.potionsT = potions; 
} 

は、私は(それがself.potionsTが何を意味するのかだ)potionsTのためのアクセサを使用するようにコードを変更。また、新しい文字列を作成するのではなく、提供された文字列を保持するだけです。 NSStringは不変なので、結果は同じです。ただし、最高の結果を得るには、potionTプロパティをretainからcopyに変更してください。そうすれば、変更可能な文字列が渡された場合、保持されている文字列の代わりにコピーされます(不変の文字列はそのまま残されます)。

+0

ねえ、私はそれを試みましたが、まだそれはクラッシュします... – Eli

+1

"それはクラッシュする"問題を解決するために非常に遠くに行くことはありません。結果のスタックトレースを見て、*何がクラッシュするかを調べる。どの行? EXC_BAD_ACCESSを取得した場合は、不良ポインタを逆参照しているため、それがどのポインタであったか、どのように無効になったのかを把握してください。 – Caleb

関連する問題