2010-12-05 11 views
1

私はこのエラーを取得し続け、私はちょうど理由を理解していません。私はこれに新しいので、多分誰かが問題を指摘することができます。iPhone - 割り当て解除されたインスタンスにメッセージを送信する - なぜですか?

エラー:

-[ShareXML release]: message sent to deallocated instance 

コード:

if(self.share){ 
     NSLog(@"SHARE ALREADY EXISTS"); 
     [self.share startSomeProcess]; 
    }else{ 
     NSLog(@"share xml"); 
     ShareXML *shareXML = [[ShareXML alloc] init]; 
     self.share = shareXML; 
     self.share.delegate = self; 
     [self.share startSomeProcess]; 
     NSLog(@"SHARE XML RELEASED"); 
     [shareXML release]; 
} 

ShareXMLがNSObjectのです。私は、View Controller上でほぼ同じコードを使用しています。 ありがとう!

+0

あなたは 'share'プロパティの宣言を投稿できますか?割り当てられた値は保持されますか? –

+0

はいヘッダーにshareXMLを@property(nonatomic、retain)ShareXML * shareと宣言します。もちろん.mファイルでこれを合成します。 – user157733

答えて

1

割り当て解除されたインスタンスへのメッセージが送信される場所を見つけるには、on CocoaDevのように環境変数NSZombieEnabledを設定します。

コンパイラにエラーが見つかる可能性が高い場合は、アナライザをビルドしてください。それは、ビルドメニューの "ビルドと分析"にあるか、shift-ctrl-Aをタップするだけです。

問題がどこにあるのかを正確に特定しておくと、おそらく明らかになりますが、さらにコードを投稿することができます。

+0

私はどこにこの行があるのか​​分かります... if(self.share){[self.share startSomeProcess];} ....なぜ私は理解できませんが、共有は割り当てが解除されたと思っていますが、私はdeallocでそれをリリースするだけで、なぜ(self.share)が割り当て解除された場合には間違っているかどうかを確かめてください。 – user157733

+0

投稿した回答から、startSomeProcessによってデリゲートメソッドが呼び出されましたが、デリゲートが解放されたと思います。 –

0

共有プロパティのようなサウンドは「保持」されません。したがって、デストラクタでは、共有メンバが解放されると、同じオブジェクトshareXMLがすでに解放されているため、共有メンバは2回目に解放されます。

1

ビューコントローラを表示すると、ナビゲーションコントローラ/プレゼンテーション親ビュー/タブバーコントローラによって保持されます。この場合、ShareXMLオブジェクトは何も保持されません。 @ Sam Ritchieが指示しているように、self.shareを設定したときにそれを保持する@property (nonatomic, retain) ShareXML *share;を宣言すると、

deallocメソッドで必ずリリースしてください。私の好みのメソッドはself.share = nil;です。これは現在self.shareによって保持されているものをすべて解放し、それをnilに設定します。

+0

それは私がやっていることですが、私はまだ問題を抱えていますか? – user157733

0

見つけました。私はShareXMLでデリゲートを公開していました。しかし、すべてのコメントをありがとう、それは私のコードの残りの部分をチェックさせる!

関連する問題