1

機器はメモリリークを検出します:

(Leaked Object= "__NSCFString")

これは私のコードです:

-(NSArray*)loadAllPages{
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Page" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                        initWithKey:@"date" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release];

    NSError *error = nil;
    myArray = [[NSArray alloc ]initWithArray:[[context executeFetchRequest:fetchRequest error:&error]autorelease]];

    [fetchRequest release];
    if (myArray == nil)
        NSLog(@"%@",error);
    return myArray;
}

リークが指摘されている行は、の初期化ですmyArray。戻らなければmyArrayこのリークは起こらないので不思議です。

4

2 に答える 2

0

ARCを使用していない場合。

return myArray;で変更return [myArray autorelease];

メソッドから割り当てられたオブジェクトを返しますが、そのオブジェクトの所有権は引き続きメソッドにあります。このようなシナリオでは、auroreleasedオブジェクトを返し、受信側で保持する必要があります。次に、そのオブジェクトの所有権は呼び出し元のメソッドになります。

于 2012-12-19T06:19:26.390 に答える
0

この行で

myArray = [[NSArray alloc ]initWithArray:[[context executeFetchRequest:fetchRequest error:&error]autorelease]];

角かっこは少し間違っています。は、割り当てられた配列ではなくautorelease、の結果に送信されます。[context executeFetchRequest:...]

[context executeFetchRequest:...]自動解放された配列を返します。autoreleaseそのアレイへの送信はエラーです。そしてmyArray割り当てられますが、コードでリリースされません。

Xcode静的アナライザはこれもエラーとして報告します。

ここに画像の説明を入力してください

私はあなたが意味したと思います

myArray = [[[NSArray alloc] initWithArray:[context executeFetchRequest:fetchRequest error:&error]] autorelease];

これにより、配列が自動解放されmyArrayます。

于 2012-12-19T06:26:25.260 に答える