2010-05-16 57 views
0

我是相當新的Objective-C和我不知道如何正確處理內存管理在以下情形:Objective-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(第一和被安排的兒童吸氣劑的最後一行)。 NSSet allObjects方法是否已經返回一個保留的數組?這可能太晚了,我喝了一杯咖啡過量。

如果有人能指出我正確的方向,我會非常感激。我想我錯過了記憶管理知識的重要部分,我一定會仔細研究它。

回答

3

-allObjects返回一個autoreleased實例,不需要保留和釋放它。

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

你做不調用合成二傳手直接分配給實例變量:

至於arrangedChildren,它只會如果使用合成的setter保留。

最後,你不應該在這裏保留的返回值 - 你的方法沒有命名開始allocnewcreate,從而呼叫者必須take ownership explicitly

我建議閱讀Objective-C語言描述中的"Cocoa Memory Management Guide""Declared Properties"部分。

+0

我剛剛通過鏈接查看了內存管理的對象所有權和處置章節,我想我現在明白了。我想我需要再次閱讀整個指南,因爲我確信我第一次錯過了。 非常有用的答案!謝謝! – 2010-05-16 21:46:01

+0

鑑於你從來沒有讀過伊娃,看起來毫無意義。使該屬性爲只讀方法,並在該方法中使用本地變量'arrangedChildren'。然後,如喬治所說,不要保留/釋放未經安排的兒童,也不要保留已安排的兒童。你也可以失去'@synthesize ...'。 – JeremyP 2010-05-17 09:39:42

0

您的@property中的retain應該照顧好。你需要release它在你的dealloc。

+0

感謝您的提示,我忘了將dealloc方法複製到帖子中,因爲我遺漏了課程的其餘部分。 – 2010-05-16 21:34:43