2011-09-10 25 views
0

私は、このオブジェクトの解放に対処するかどうかはわかりません私は次のようになっています:不正な減少は

参照カウントの間違った減少発呼者

[self.imageView release];線このエラーポイントによって、この時点で を所有していないオブジェクトの。

+1

その行は完全には不要です。 – hop

答えて

4

あなたはnilのリリースを呼び出しています。 self.imageView=nil;(imageViewを解放してそれをnilに設定する)または[imageView release];(imageViewを解放するだけですが、それ以上使用しないため、nilに設定する必要はありません)を削除してください。

編集: @Bavariousがここに漏れがあると言ったように:

self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 

あなたの代わりにこのようにそれを呼び出す必要があります:

self.imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease]; 
+2

'self.imageView' - ' -initWithFrame: 'が漏れていることに注目して、' retain'プロパティに割り当てられている所有オブジェクトを返します。 –

+0

答えに追加するには、deallocメソッドでnilに設定する必要があります。 'self.imageView = nil;' –

+0

リリース後にnilに設定するとOKになります。しかし、リリース前にそれを無制限に設定することはできません。 – Mohammad

0

ためにリリースし、漏れ問題を避けるためのコードを変更deallocこのようなメソッド。

-(void)dealloc 
{  
    [imageView release]; 
    self.imageView = nil; 
    [super dealloc]; 
} 

問題を解決しました。あなたのdeallocメソッドでは2つのバグがあります

+0

私はあなたのために書式を改善する自由を取った。 [Markdown Editing Help](http://stackoverflow.com/editing-help)をご覧ください。 – albertamg

0

(1)あなたは、あなたのdeallocで最後行として[super dealloc]を置くべき

あなたのオブジェクトが意志である[super dealloc]まず、メモリを呼び出す場合解放される(おそらく他の何かによって使用される)。その後、あなたのオブジェクトのメンバーを使うことはできません。彼らはあなたのものではありません!

(2)deallocメソッドでプロパティを使用しないことをお勧めします。あなたは他に何が起こるかわからない(他のオブジェクトはKVOでリスニングしているかもしれないし、サブクラスは他の何かをするためにセッターをオーバーライドしたかもしれない)。

あなたが正しいのdeallocは、次のようになります。助け

- (void)dealloc { 
    [imageView release]; 
    [super dealloc]; 
} 

希望を!

+0

deallocでプロパティを使用できないことは、どこから確認できましたか? –

+0

ここでは:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW1 - 「Don」というタイトルのセクションは、 t初期化メソッドのアクセッサメソッドを使用し、 ' – deanWombourne

+0

をdeallocしかし、彼らはそこに多くの詳細に行くreallocので、このスレッドもかなり面白いです:http://www.cocoabuilder.com/archive/cocoa/242096-avoiding-kvo- in-dealloc.html – deanWombourne