2010-05-16 5 views
0

내가 목표 - C로 비교적 새로운 해요 올바르게 다음 시나리오에서 메모리 관리를 처리하는 방법을 확실하지 않다 : 나는 일대 다 관계가있는 코어 데이터 엔터티를는 목표 - C 게터 메모리 관리

중요한 "아이들"을 위해.

@interface AbstractItem : NSManagedObject 
{ 
    NSArray * arrangedChildren; 
} 

@property (nonatomic, retain) NSSet * children; 
@property (nonatomic, retain) NSNumber * position; 
@property (nonatomic, retain) NSArray * arrangedChildren; 

@end 


@implementation AbstractItem 

@dynamic children; 
@dynamic position; 
@synthesize arrangedChildren; 

- (NSArray*)arrangedChildren 
{ 
    NSArray* unarrangedChildren = [[self.children allObjects] retain]; 
    NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES]; 
    [arrangedChildren release]; 
    arrangedChildren = [unarrangedChildren sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
    [sortDescriptor release]; 
    [unarrangedChildren release]; 
    return [arrangedChildren retain]; 
} 

@end 

내가 unarrangedChildren 및 반환 arrangedChildren을 (최초의 유지 여부를 확실하지 않다 : 열 "위치"으로 분류되어 배열로 아이들에 액세스하려면, 나는 모델 클래스 이런 식으로 썼다 및 arrangedChildren getter의 마지막 행). NSSet allObjects 메서드가 이미 보유 배열을 반환합니까? 아마 너무 늦었고 커피가 과다 복용했습니다.

누군가가 올바른 방향으로 나를 가리킬 수 있다면 정말 감사 할 것입니다. 나는 메모리 관리 지식의 중요한 부분을 놓치고 있다고 생각한다. 나는 그것을 철저히 조사 할 것이다.

답변

3

-allObjects은 자동 릴리즈 된 인스턴스를 반환하므로이를 유지하고 해제 할 필요가 없습니다. 당신이 합성 세터를 호출하지 않는 것처럼

self.arrangedChildren = [unarrangedChildren sortedArrayUsingDescriptors:/*...*/]; 

이 직접 인스턴스 변수에 할당 : 당신이 합성 세터를 사용하는 경우 arrangedChildren에 관해서는

, 그것은 단지 유지됩니다.

마지막으로, 당신은 여기 반환 값을 유지하지해야한다 - 당신의 방법은 alloc, new 또는 create 발신자 따라서 take ownership explicitly에가로 시작하는 이름이되지 않습니다.

Objective-C 언어 설명에서 "Cocoa Memory Management Guide""Declared Properties" 섹션을 읽는 것이 좋습니다.

+0

방금 ​​메모리 관리의 개체 소유권 및 폐기 장에 대한 링크를 읽었으며 지금은 이해하고 있다고 생각합니다. 나는 내가 처음으로 많이 그리워 했으므로 전체 가이드를 다시 읽을 필요가 있다고 생각한다. 매우 유용한 답변입니다. 감사! –

+0

당신이 ivar을 읽지 않는다는 것을 감안할 때, 전혀 가지고 있지 않은 것 같습니다. 속성을 읽기 전용으로 만들고 변수'arrangedChildren'을 메소드에 로컬로 만듭니다. 그런 다음 Georg이 말했듯이 unarrangedChildren을 유지/해제하거나 arranchedChildren을 유지하지 마십시오. 그리고 여러분은'@synthesize ... '도 잃을 수 있습니다. – JeremyP

0

arranchedChildren의 @property에있는 retain이이를 처리해야합니다. 당신 dealloc에 ​​release해야합니다.

+0

힌트를 보내 주셔서 감사 드리며 나머지 클래스를 생략 할 때 dealloc 메서드를 게시물에 복사하는 것을 잊어 버렸습니다. –