【问题标题】:Very basic Objective-c Memory management非常基本的 Objective-c 内存管理
【发布时间】:2012-05-16 18:18:19
【问题描述】:

我是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];
    } 

【问题讨论】:

    标签: objective-c memory-management properties


    【解决方案1】:

    只要您的category 属性定义为retaincopy,您的所有三个示例看起来都是正确的。记得在viewDidUnloaddealloc中释放(或设置为nil)。

    【讨论】:

      【解决方案2】:

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

      @property (nonatomic,retain) NSArray *category;
      

      并且由于您的属性保留了数组,因此您必须稍后释放它,例如在交易中。

      【讨论】:

        【解决方案3】:

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

        [NSArray arrayWithObjects: ..., nil];

        这将为您返回一个自动释放实例。

        如果您在不再需要它之后保留它,请不要忘记在此数组上调用 release

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          • 1970-01-01
          • 2020-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          相关资源
          最近更新 更多