通过"便利构造函数"初始化的返回对象

Bri*_*ian 2 memory-management initialization objective-c return-value autorelease

当一个实例方法返回一个用方便构造函数初始化的值时,我是否需要保留该对象然后在返回中自动释放,以便在方便构造函数的自动释放发生时,它不会删除该对象.

这个版本会在调用代码之前发布描述并使用retain或者其他东西获得所有权吗?

- (NSStringMutable *)test {
    NSMutableString *description = [NSMutableString stringWithString:@"Test Value"];
    return description;
}
Run Code Online (Sandbox Code Playgroud)

或者它应该是这样的?

- (NSStringMutable *)test {
    NSMutableString *description = [NSMutableString stringWithString:@"Test Value"];
    [description retain];                               
    return [description autorelease];
}
Run Code Online (Sandbox Code Playgroud)

电话代码:

NSMutableString *testVar = [[NSMutableString alloc] initWithString:[object description]];
Run Code Online (Sandbox Code Playgroud)

Dan*_*sky 9

不,你应该没事:

- (NSStringMutable *)test
{
    return [NSMutableString stringWithString:@"Test Value"];
}
Run Code Online (Sandbox Code Playgroud)

这将使对象的保留计数为1,并且将在自动释放池中.

自动释放池在特定时间耗尽 - 它不像垃圾收集器.如果您正在实现事件处理程序(如按钮单击处理程序),则从事件处理代码返回时,框架会自动释放自动释放池.

如果您使用过此:

- (NSStringMutable *)test
{
    NSMutableString *description = [NSMutableString stringWithString:@"Test Value"];
    [description retain];                                                               
    return [description autorelease];
}
Run Code Online (Sandbox Code Playgroud)

...然后该对象的保留计数为2,并且将在自动释放池中两次,并且实际上将以与上一代码示例相同的方式运行.

  • 你是对的,但试着避免谈论保留计数,它们是一个红色的鲱鱼 - 没有保证NSMutableString将返回一个自动释放的对象,只是它返回一个你当前不拥有的可变字符串.您可以安全地将结果返回给调用者,因为内存管理规则明确说"该方法也可以安全地将对象返回给调用者".<http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html> (2认同)
  • 那是个很好的观点.我发现在保留计数方面的思考对于解释事物很方便.你是对的 - 你所知道的是stringWithString返回一个由其他人拥有的对象.在这种情况下,由于NSMutableString实际分配了对象,因此NSMutableString有责任释放它.不过,我的印象是,这些便捷构造函数(非初始构造函数)通常会返回自动释放的对象.如果我遇到一个不这样做的人,我会感到惊讶. (2认同)