Objective-C Getter内存管理
我对Objective-C相当陌生,不确定在以下场景中如何正确处理内存管理: 我有一个核心数据实体,它与关键的“子对象”有一对多的关系。为了以数组的形式访问子对象(按“位置”列排序),我以如下方式编写了模型类:Objective-C Getter内存管理,objective-c,memory-management,Objective C,Memory Management,我对Objective-C相当陌生,不确定在以下场景中如何正确处理内存管理: 我有一个核心数据实体,它与关键的“子对象”有一对多的关系。为了以数组的形式访问子对象(按“位置”列排序),我以如下方式编写了模型类: @interface AbstractItem : NSManagedObject { NSArray * arrangedChildren; } @property (nonatomic, retain) NSSet * children; @property (non
@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方法是否已返回保留数组?可能太晚了,我喝咖啡过量了
如果有人能给我指出正确的方向,我会非常感激。我想我错过了内存管理知识的重要部分,我一定会彻底研究它。您的@property for arrangedChildren中的
retain
应该会解决这个问题。您需要在您的dealloc中释放它。您的@property for arrangedChildren中的保留
应该负责这一点。您需要在dealloc中释放它。-allObjects
返回一个自动释放的实例,不需要保留和释放它
对于arrangedChildren
,仅当您使用合成setter时,才会保留它:
self.arrangedChildren = [unarrangedChildren sortedArrayUsingDescriptors:/*...*/];
直接向实例变量赋值不会调用综合setter
最后,您不应该在此处保留返回值-您的方法不是以alloc
、new
或create
开头命名的,因此调用方必须这样做
我建议阅读Objective-C语言描述中的和的部分。-allObjects返回一个自动删除的实例,无需保留和释放它 对于
arrangedChildren
,仅当您使用合成setter时,才会保留它:
self.arrangedChildren = [unarrangedChildren sortedArrayUsingDescriptors:/*...*/];
直接向实例变量赋值不会调用综合setter
最后,您不应该在此处保留返回值-您的方法不是以alloc
、new
或create
开头命名的,因此调用方必须这样做
我建议您阅读Objective-C语言描述中的和的部分。谢谢您的提示,我忘了将dealloc方法复制到文章中,因为我遗漏了本课程的其余部分。谢谢您的提示,我忘了将dealloc方法复制到文章中,因为我遗漏了其他的部分。我刚刚阅读了你关于内存管理的对象所有权和处置章节的链接,我想我现在明白了。我想我需要再读一遍整个指南,因为我肯定我第一次错过了很多。非常有用的答案!谢谢鉴于你从未读过ivar,拥有它似乎毫无意义。将属性设置为只读,并将变量
arrangedChildren
设置为方法的本地变量。然后,正如乔治所说,不要保留/释放未安排的孩子,也不要保留已安排的孩子。您也可能会丢失@synthesis…
。我刚刚阅读了您指向内存管理的对象所有权和处置章节的链接,我想我现在明白了。我想我需要再读一遍整个指南,因为我肯定我第一次错过了很多。非常有用的答案!谢谢鉴于你从未读过ivar,拥有它似乎毫无意义。将属性设置为只读,并将变量arrangedChildren
设置为方法的本地变量。然后,正如乔治所说,不要保留/释放未安排的孩子,也不要保留已安排的孩子。您也可能会丢失@synthesis…
。