2011-07-07 11 views
1

次のコードでメモリリークが発生しています。インストゥルメント自体がクラッシュする前に、メモリリークの87.5%を得ました。たぶんあなたの誰かが私にこのコードの何が間違っているか教えてくれるかもしれません。私はここに何かをリリースする必要がありますか?ありがとう。なぜならそれは私が私のMANAGED_OBJECTsをコピーするmutableCopyを使用しなかったメソッド間で渡されたコアデータmanagedObjectを割り当てるときにメモリリークが発生する

+0xc7 calll DYLD-STUB$$objc_msgSend = 87.5%

:ここ

- (void)browseSSviewControllerDidFinish:(browseSSviewController *)controller { 
<SNIP> 
     MANAGED_OBJECT_1 = [self newFormatFromFormat:MANAGED_OBJECT_2]; 
<SNIP> 
} 

- (Format *)newFormatFromFormat:(Format *)formatToCopy { 

    NSLog(@"making new format that's a copy"); 
    Format *thisNewFormat = [self newBlankFormat]; 
    [self updateFormat:thisNewFormat withNumbersFromFormat:formatToCopy]; 
    return thisNewFormat; 
} 

-(void)updateFormat:(Format *)formatToCopyTo withNumbersFromFormat:(Format *)formatToCopyFrom { 
    NSLog(@"copying formats"); 
    formatToCopyTo.x = formatToCopyFrom.x; 
    formatToCopyTo.y = formatToCopyFrom.y; 
    formatToCopyTo.z = formatToCopyFrom.z; 
    formatToCopyTo.a = formatToCopyFrom.a; 
    formatToCopyTo.n = formatToCopyFrom.n; 
    formatToCopyTo.u = formatToCopyFrom.u; 
    formatToCopyTo.s = formatToCopyFrom.s; 
} 

- (Format *)newBlankFormat { 

    NSLog(@"making new blank format"); 
    gfghfAppDelegate *del = (gfghfAppDelegate *)[UIApplication sharedApplication].delegate; 
    NSManagedObjectContext *MOC = del.managedObjectContext; 
    NSPersistentStoreCoordinator *PSC = [MOC persistentStoreCoordinator]; 
    NSManagedObjectModel *MOM = [PSC managedObjectModel]; 
    NSEntityDescription *entity = [[MOM entitiesByName] objectForKey:@"Format"]; 
    Format *thisNewFormat = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:MOC]; 
    thisNewFormat.slot = [NSNumber numberWithInt:-1]; 
    NSLog(@"slot = %@",thisNewFormat.slot); 
    return thisNewFormat; 
} 

は楽器がクラッシュする前に、私は私のバックトレースから抜け出すことができた漏れの87.5%ですちょうどうまくいかなかった。

+0

PS:ここ

は、リークを修正したと思われる改正は「thisNewFormat newBlankFormat」の新バージョンでは、ビューコントローラオブジェクト。 – CommaToast

答えて

0

NSEntityDescriptionの「insertNewObjectForEntityForName:inManagedObjectContext:」という便利なメソッドを使用しました(「管理対象オブジェクトの作成と削除」の章の「管理対象オブジェクトの作成、初期化、および保存」の章を参照)コアデータプログラミングガイド」を参照)。

私は自分の問題は、最初に "initWithEntity:insertIntoManagedObjectContext"で "NSManagedObject alloc"を使用していたと思います。これは自動解放オブジェクトを作成しません。このメソッドから戻り値を取得したインスタンス変数を使用して、後で返される値を「解放」する別のメソッドから自分自身を解放する場合でも、リークします。しかし、mallocの周りに「保持」するかどうかにかかわらず、リリースカウントはインクリメントされていませんでした。これは適切なinit関数ではないので、私は信じません。なぜ私は分からない。

しかし、次のリビジョンではリークが修正されているので、私は気にしません。Appleがとにかく勧めたものです(私はサンプルプロジェクトの古いコードを使用していたと思います)。機能: - MANAGED_OBJECT_1とMANAGED_OBJECT_2は、両方のインスタンス変数です - カスタムのプロパティ

- (Format *)newBlankFormat:(Format *)thisNewFormat { 
      NSLog(@"making new blank format"); 
      gfghfAppDelegate *del = (gfghfAppDelegate *)[UIApplication sharedApplication].delegate; 
      NSManagedObjectContext *MOC = del.managedObjectContext; 
      //[MOC reset]; don't do this, it will erase MANAGED_OBJECT_2 
      thisNewFormat = [NSEntityDescription insertNewObjectForEntityForName:@"Format" inManagedObjectContext:MOC]; //this is much better than using the malloc variety 
      thisNewFormat.slot = [NSNumber numberWithInt:-1]; 
      NSLog(@"slot = %@",thisNewFormat.slot); 
      return thisNewFormat; 
} 
+0

[MOC Reset]によってMANAGED_OBJECT_2がコンテキストから消去されるため、実際には機能しません。それをどのように修正できるかを示すために編集する。 – CommaToast

+0

また、実行ループは、別のオブジェクトが渡されたメッセージでそれを受け取る前に終了するため、この自動作成されたオブジェクトによって作成されたアプリケーションがクラッシュしました。それは漏れをクリアするために、新たにalloc'd Formatオブジェクトで指される前にも、まだそれが渡されたとして保持されますオブジェクトを作成しながら、最初の質問に元のメソッドに戻って「thisNewFormat」のリリースを追加する必要がありましたさまざまなオブジェクトとメソッドの間にあります。 – CommaToast

関連する問題