非常基本的Objective-c内存管理

时间:2012-05-08 09:05:25

标签: objective-c memory-management properties

我是Objective-c的新手,我想知道当我返回类似下面代码的对象时,我是否应该像这样自动释放它:

- (NSArray *)loadCategory
{
    NSArray *temp = [[[NSArray alloc] initWithObjects:c1, c2, nil] autorelease];

    return temp;
}

更多,当我使用调用函数获取返回值时,是否应该保留目标?

- (void)viewDidLoad
{
     category = [self loadCategory];

     [category retain];

   [super viewDidLoad];
}

最后,我可以替换为:

- (void)viewDidLoad
    {
        self.category = [self loadCategory];
       [super viewDidLoad];
    } 

3 个答案:

答案 0 :(得分:0)

只要您的category属性定义为retaincopy,您的所有三个示例都会正确无误。请务必在nilviewDidUnload中发布(或设置为dealloc)。

答案 1 :(得分:0)

是的,你是对的,你需要在loadCategory方法中调用autorelease。这允许自动释放池处理数组对象的释放(在调用代码进行更改以保留它之前,它不会被释放)。是的,您需要保留调用代码中的数组。最后,是的,只要你的self.category属性用'retain'声明:

@property (nonatomic,retain) NSArray *category;

由于您的属性会保留数组,因此您必须稍后将其释放,例如在dealloc。

答案 2 :(得分:0)

你的代码很好。 你也可以使用......

  

[NSArray arrayWithObjects:...,nil];

这将为您返回一个自动发布实例。

如果您不再需要保留,请不要忘记在此阵列上调用发布