【问题标题】:release returned object or do i have to use autorelease释放返回的对象还是我必须使用自动释放
【发布时间】:2011-12-15 19:42:59
【问题描述】:

示例代码:

- (Foo*)createFoo {
    Foo *foo = [[Foo alloc] init];
    return foo;
}

- (void)someOtherMethod {
    Foo *foo;
    foo = [self createFoo]; //retain count 1
    [foo release]; //retain count = 0 => object gets released?

    //repeat
    foo = [self createFoo];
    [foo release];
}

问题:我必须在 createFoo 中自动释放还是可以在 someOtherMethod 中释放返回的对象?

【问题讨论】:

  • 我想你是在调用 [self createFoo] 而不是 [self Foo],那么可以在 someOtherMethod 中释放它。请记住,ARC 可以让您摆脱几乎所有的问题...
  • @ilMalvagioDottorProsciutto 虽然我同意 ARC 的评论,但我认为了解应该如何手动完成是件好事,除了 ARC 只是将这些调用放在任何地方,所以知道它在做什么相当不错。
  • @SimonLee 正是我的想法

标签: objective-c release autorelease retaincount


【解决方案1】:

当您将所有权移交给调用代码时,您在此实例中的代码应该自动释放您的对象,您不再希望在方法中对其负责,因此您应该放弃对它的保留。

记住 NARC - 以这些关键字开头的方法假定不会自动释放...

新建、分配、保留、复制

如果您的方法被命名为newFoocopyFoo,那么您上面的代码无需自动释放即可。

【讨论】:

  • 所以不会出错,如果按照苹果代码要求将 createFoo 重命名为 newFoo ?
  • 可以,否则自动释放,然后在调用代码中保留,完成后释放。
【解决方案2】:

Cocoa 内存管理实际上非常简单,因为每个人都遵守一套规则。你没有遵守这些规则,所以你会遇到麻烦。

阅读Basic Memory Management Rules。如果你坚持遵守这些规则,你应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2011-03-16
    • 2010-12-16
    相关资源
    最近更新 更多