2011-12-14 2 views
1

범주 (비 원자, 유지)로 선언 된 NSMutableArray 속성이 있습니다. dealloc에서 그 변수에 대한 메모리를 해제합니다. 원래 viewDidLoad에서 배열을 할당하고 해당 데이터에 더미 데이터를 채우는 다른 메서드를 호출했습니다. 기본적으로자동 실행 해제 된 변수를 보존하려면 어디에서 해제해야합니까?

[categories addObject:someObject1]; 
[categories addObject:someObject2]; 
.... 

이것은 작동하고있었습니다.

그런 다음 동료와 실제 데이터를 모델로 전달하고 자동 레이아웃 된 배열을 반환했습니다. 방법을 사용하면 EXC_BAD_ACCESS가 표시됩니다.

categories = [datamanager GetCategories]; 

이제 datamanager GetCategories 메소드에서 반환 된 자동 레이아웃 배열을 유지하지 않았기 때문에 그렇게 되었습니까?

그렇다면 메모리 누수가 될 수 있으므로 viewDidLoad에서 alloc/init을 삭제해야합니다.

감사합니다. 단지 메모리 관리를 올바르게 이해하고 있는지 확인하려고합니다.

답변

4

나는 당신이 올바른 길에 있다고 생각합니다. 자동 응답 된 개체를 반환하는 메서드에서 categories을 얻는다면 을 유지해야합니다. 그래서 당신은 다음 중 하나에 위의 할당을 변경할 수 있습니다 viewDidLoad에서

// use the synthesized setter's retain 
self.categories = [datamanager GetCategories]; 

// or explicitly retain the object (which clearly indicates the code's intention) 
categories = [[datamanager GetCategories] retain]; 

ALLOC를/초기화가 필요하지 않습니다.

+3

나는 'self.' 구문을 사용하는 것이 가장 좋습니다. Obj-C 2.0 프로퍼티를 이미 선언했다면, 그것을 사용할 수도있다. – darvids0n

+1

darvids0n에 동의하면 self.property = 직접 설정하는 것보다 항상 바람직합니다. 특히 setter를 무시할 때 항상 작동하지 않는 이유를 알 수 없습니다. –

+0

'self.' 문법이 바람직합니다. 그러나 Obj-c 메모리 관리를 배우는 사람이 두 옵션의 작동 방식을 이해하는 것이 중요합니다. – SundayMonday

관련 문제