0

Analyze インストゥルメントを使用してメモリ リークを確認しようとしましたが、Xcode はこの時点でメモリ リークを表示します。

.h

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

.m

@synthesize managedObjectContext = __managedObjectContext;

次に、コードでこれを行います:

AppDelegate *appController = [[UIApplication sharedApplication] delegate];

self.managedObjectContext = [[NSManagedObjectContext alloc] init];
[self.managedObjectContext setUndoManager:nil];
[self.managedObjectContext setPersistentStoreCoordinator: [appController persistentStoreCoordinator]];

そしてdeallocこれで:

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

次の行でメモリリークが発生します。

[self.managedObjectContext setUndoManager:nil];

このオブジェクトの場合:

self.managedObjectContext = [[NSManagedObjectContext alloc] init];

でリリースしましたがdealloc、なぜそこでメモリ リークが発生するのですか?

4

2 に答える 2

2

_managedObjectContext保持カウントが 2 倍になるため、リークしますが、解放するのは 1 回だけです。プロパティを作成strongしました。これは、オブジェクトが割り当てられたときにオブジェクトを保持することを意味します。managedObjectContextただし、自動解放 (または手動解放) せずに割り当てることもできます。したがって、エラーは次の行にあります。

self.managedObjectContext = [[NSManagedObjectContext alloc] init];

割り当てたオブジェクトの保持カウントは 1 になりますが、合成されたプロパティはそれをもう一度保持するため、保持カウントは 2 になります。 1の。

あなたがする必要があるのは、割り当てたオブジェクトを自動解放することです:

self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];

または、合成されたセッターを呼び出さずに、直接割り当てます_managedObjectContext:

_managedObjectContext = [[NSManagedObjectContext alloc] init];

_managedObjectContextが nil でない場合、後者はリークするため、前者をお勧めします。ただし_managedObjectContext、割り当て前に nil であることが確実な場合は、どちらかを選択できます。

于 2012-06-03T12:35:24.917 に答える
1

この行...

self.managedObjectContext = [[NSManagedObjectContext alloc] init];

...保持カウントを2つ増やします。1つは割り当て用で、もう1つはプロパティの「ストロング」用です。

試す:

__managedObjectContext = [[NSManagedObjectContext alloc] init];
于 2012-06-03T12:24:11.393 に答える