2012-06-03 59 views
0

我曾嘗試使用分析儀器看到內存泄漏和Xcode中給了我在這一點上內存泄漏:發佈managedObjectContext對象C

.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和一個用於對物業的「強勢」的保留計數。

嘗試:

__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

你需要做的是要麼自動釋放你分配對象什麼保留計數:

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

或不叫合成的二傳手,但分配d irectly到_managedObjectContext

_managedObjectContext = [[NSManagedObjectContext alloc] init]; 

我會推薦前者,因爲後者會泄漏,如果_managedObjectContext不爲零。但是,如果您確定_managedObjectContext在作業之前爲零,您可以選擇任意一個。

+0

感謝您的回答,所以我必須自己做。managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];並在dealloc中刪除[__managedObjectContext release]; ? – Piero

+0

@Piero是的。無論如何,該版本必須在* dealloc *中調用。如果你把* strong *(和你的代碼中的* retain *一樣),你也需要在對象被銷燬時釋放它。相反,你有內存泄漏。 –

+0

好吧,所以我必須編輯只有這個:self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];對? – Piero