2012-06-03 2 views
0

나는 메모리 누수를 확인하기 위해 악기를 분석 사용하려고했고, 엑스 코드는 나에게이 시점에서 메모리 누수 제공 :출시 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 용과 속성의 "강한"1 씩 카운트를 보유 증가시킨다.

시도 :

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

괜찮지 만 아크가 없기 때문에 비 강요 대신 비 원자력을 사용할 수 있습니까? ... 그리고 나서이 작업을 수행해야합니까? self.managedObjectContext = [[NSManagedObjectContext alloc] init]; 아니면 그 줄을 지울 수 있니? – Piero

+0

제안대로 한 줄을 변경하면 누출 여부를 알 수 있습니다. –

2

귀하의 _managedObjectContext 누출의 유지 카운트가 두 배 증가,하지만 당신은 한 번만를 해제하기 때문이다. 당신은 당신의 속성을 strong으로 만들었습니다. 이것은 객체가 할당되었을 때 객체를 유지한다는 것을 의미합니다. 하지만 managedObjectContext을 자동 다시 검색 (또는 수동으로 해제)하지 않고 할당합니다. 따라서 오류가이 라인에 있습니다

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

당신이 할당 목적은 (1)의 유지 수를해야하지만 합성 된 속성을 사용하면 놓으면 따라서 2의 그것을 유지 수를 제공 한 번 더 유지합니다

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

여부가 합성 세터를 호출 여전히 당신도 당신이 할당 객체를 autorelease를하기 만하면 무엇 1.

의 유지 수를 가지고 있기 때문에 그것의 dealloc, 그것은 주변에 남아있을 것입니다 ,하지만 d를 지정하십시오. irectly _managedObjectContext에 : _managedObjectContext가 nil이 아닌 경우

_managedObjectContext = [[NSManagedObjectContext alloc] init]; 

나는 누출 후반부터 전자를 추천 할 것입니다. 그러나 할당 전에 _managedObjectContext이 nil이라고 확신하는 경우 원하는 것을 선택할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease]; 그리고 dealloc에서 나는 [__managedObjectContext release]를 삭제합니다; ? – Piero

+0

@ 피에로 예. 어쨌든 * dealloc *에서 릴리스를 호출해야합니다. * strong * (코드에서 * retain *과 동일)를 넣으면 객체가 삭제 될 때 해제해야합니다. 반대로, 메모리 누수가 있습니다. –

+0

ok 이렇게 편집해야합니다 : self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease]; 권리? – Piero

관련 문제