2011-10-28 8 views
2

最後の2日間はメモリリークを捜すのに費やした。私はドキュメントを読んで、インターネットで良い情報を探しました(Owen Goss「iOSアプリケーションでメモリリークを見つけて修正する」など)。しかし、私は解決するにはあまりにも多くの謎を持っています。すべてのallocが解放されてもメモリリークが発生する

たとえば、このコードがInstrumentsで何度も点灯します。私は最善を尽くしましたが、修正できませんでした。

- (void) updateUserDefaults 
{ 
    // alloc temporary Array for object´s positions 
    NSMutableArray *tArray = [[NSMutableArray alloc] init]; 

    // store locations of objects 
    for (int i=0; i<[originalOrigins count]; ++i) { 
     CGPoint foo = [self.view viewWithTag:100+i].center; 
     NSString *moo = NSStringFromCGPoint(foo); 
     [tArray addObject:moo]; 
     [moo release]; //? 
    } 

    // retrieve all stored positions for all objects 
    NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain]; 

    // replace with objects from this level 
    [zettelPannedOrigins replaceObjectAtIndex:zettelAtIndexInTonebank withObject:tArray]; 

    // save 
    [[NSUserDefaults standardUserDefaults] setObject:zettelPannedOrigins forKey:@"zettelPannedOrigins"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    // clean up memory 
    [tArray release]; 
    [zettelPannedOrigins release]; //? 

} 

私が他の人にとって興味深いと思うのは、私が割り当てたものをリリースするということです。しかしまだそれは漏れている。これは私がドキュメンテーションで答えることはできません。または私はできますか?

+4

を行う必要があります。 –

答えて

9
NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain]; 

mutableCopyは一度それを保持し、あなたは再びそれにretainを呼び出しているので、これは、2の保持カウントを持っています。ここにretainに電話しないでください。

newallocretainまたはcopyの名前でメソッドを呼び出すと、そのオブジェクトが所有され、保持カウントが上昇することに注意してください。

+0

申し訳ありませんが、私は自分の答えを書いている間に投稿しました。 :) – ludesign

+0

私はこのメソッドが呼び出されたときにアプリケーションがクラッシュすることがあるので余分な保持を置いています。ゾンビは私がリリースされたオブジェクトを参照していると言いました。だから私はおそらくmutableCopyは私がそれを使う前にオートリリースされていると思っていた。したがって、私は余分な保持を置く。しかし、私は余分な保持も使用する前にそこに漏れがあった。 – me1974

+3

理由を理解することなくクラッシュしないようにアプリに余裕を持たせている場合は、クラッシュを修正するのではなく、ただ後で動かすだけです...すべてのクラッシュには厳しい理由があります。 – bbum

1

[NSObject mutableCopy];は、retainCountを1増加させたオブジェクトを返すので、別の 'retain'は必要ありません。

NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] autorelease]; 

これはloop--あなたがその参照を所有していない内部の「MOO」をリリースしないでください仕事:)

+0

オブジェクトを使用する前にオブジェクトがオートリリースされないようにするにはどうすればよいですか? – me1974

関連する問題