2012-06-03 2 views
0

Я пытался использовать Анализировать инструмент, чтобы увидеть утечки памяти, и Xcode дает мне утечка памяти в данный момент:релиз объект managedObjectContext с

.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 , почему там происходит утечка памяти?

ответ

1

Эта линия ...

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

... увеличивает сохранить счетчик на два, один для Alloc и один для «сильного» на имущество.

Try:

__managedObjectContext = [[NSManagedObjectContext alloc] init]; 
+0

ОК, но у меня нет дуги, я могу использовать сохранение неатомических, а не сильных? ... и тогда мне еще нужно это сделать? self.managedObjectContext = [[NSManagedObjectContext alloc] init]; или я могу удалить эту строку? – Piero

+0

Я предлагаю изменить одну линию, как было предложено, и затем вы увидите, пропадет ли ваша утечка. –

2

Ваши _managedObjectContext утечки, так как его сохранить счетчик увеличивается в два раза, но только выпустить его один раз. Вы сделали свое свойство strong, что означает, что он сохранит объект, когда он назначен ему. Но вы также выделяете managedObjectContext без автореализаций (или вручную). Таким образом, ошибка в этой строке:

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

Объекта вы выделяете будет иметь сохранить кол 1, но синтезированное свойство сохранит его еще один раз, следовательно, давая ему сохранить кол 2. При отпускании это в dealloc, он будет оставаться вокруг, так как она до сих пор сохранить кол 1.

Что вам нужно сделать, это либо autorelease объект, выделить:

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

или не вызывать синтезированный сеттер , но назначьте d irectly к _managedObjectContext:

_managedObjectContext = [[NSManagedObjectContext alloc] init]; 

Я бы рекомендовал бывший, так как последний будет течь, если _managedObjectContext не равна нулю. Однако, если вы уверены, что _managedObjectContext равен нулю перед назначением, вы можете выбрать любой из них, который вы хотите.

+0

спасибо за ваш ответ, так что я должен сам себя.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease]; и в dealloc i delete [__managedObjectContext release]; ? – Piero

+0

@Piero Да. Выпуск должен быть вызван в * dealloc * в любом случае. Если вы помещаете * strong * (то же, что и * сохранить * в свой код), вам также нужно освободить его, когда объект будет уничтожен. Напротив, у вас есть утечка памяти. –

+0

ОК, поэтому мне нужно редактировать только это: self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease]; правильно? – Piero

Смежные вопросы