习惯性的短寿命局部物体类似于RAII

时间:2011-10-13 11:51:24

标签: iphone objective-c ios memory-management raii

我遇到了Objective-C的这个片段:

NSNumber *theBalance = 
    [[[NSNumberFormatter alloc] init]
     numberFromString: [textField text]];

这似乎泄漏了NSNumberFormatter。在C ++中,我会做两件事之一:

  1. 使用auto
  2. NSNumberFormatter(即堆栈)存储空间
  3. 使用RAII(例如shared_ptr)来管理NSNumberFormatter
  4. 的生命

    在Objective-C中,这些选项似乎都不可能。我尝试了堆栈:

    NSNumberFormatter fmt;
    

    但是这不能编译。据我所知,Objective-C中没有与RAII直接等价的东西。我可能从错误的角度看问题是一个主要的C ++程序员,所以:

    1. 在一般情况下,正确的,惯用的(现代的)Objective-C方法处理像NSNumberFormatter这样的对象的生命是什么?我真的必须自己明确地做这件事吗?
    2. 在具体案例中是否有更好的方法来解决实际问题?

1 个答案:

答案 0 :(得分:5)

大多数类,如 NSString NSArray 等,都有方便的构造函数,如[NSString string][NSArray array],它们返回自动释放的对象。 NSNumberFormatter 没有任何便利构造函数。因此,您可以发送autorelease消息,以便在自动释放池耗尽时自动释放。

NSNumber *theBalance = [[[[NSNumberFormatter alloc] init] autorelease]
                       numberFromString: [textField text]];

如果要保留(拥有)对象的引用,可以省略autorelease并在完成后释放它。你这样做,

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSNumber *theBalance = [numberFormatter numberFromString: [textField text]];

// Later... somewhere in your code...
[numberFormatter release];

我知道以上不是详细解释。我建议您read this post,我希望您对内存管理有一个清晰的认识!