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

Fle*_*exo 2 iphone memory-management raii objective-c ios

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

NSNumber *theBalance = 
    [[[NSNumberFormatter alloc] init]
     numberFromString: [textField text]];
Run Code Online (Sandbox Code Playgroud)

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

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

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

NSNumberFormatter fmt;
Run Code Online (Sandbox Code Playgroud)

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

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

Emp*_*ack 5

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

NSNumber *theBalance = [[[[NSNumberFormatter alloc] init] autorelease]
                       numberFromString: [textField text]];
Run Code Online (Sandbox Code Playgroud)

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

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

// Later... somewhere in your code...
[numberFormatter release];
Run Code Online (Sandbox Code Playgroud)

我知道以上不是详细解释.我建议你阅读这篇文章,我希望你会对内存管理有一些清晰的认识!