2010-05-16 58 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