与RAII类似的习惯性短寿命本地对象

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

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

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

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

在Objective-C中,这些选项都不可能。 我试图在堆栈上:

 NSNumberFormatter fmt; 

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

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

NSStringNSArray等大部分类都有一些便利的构造函数,如[NSString string][NSArray array] ,它们返回自动释放的对象。 NSNumberFormatter没有任何便利的构造函数。 所以,你可以发送一个autorelease消息让自动释放当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]; 

我知道上面不是一个详细的解释。 我build议你阅读这篇文章 ,希望你能对内存pipe理有一个清晰的认识!