Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C Getter内存管理_Objective C_Memory Management - Fatal编程技术网

Objective-C Getter内存管理

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

我对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(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…