与RAII类似的习惯性短寿命本地对象
我遇到了Objective-C的这个片段:
NSNumber *theBalance = [[[NSNumberFormatter alloc] init] numberFromString: [textField text]];
这似乎泄漏NSNumberFormatter
。 在C ++中,我会做两件事情之一:
- 为
NSNumberFormatter
使用auto
(即堆栈)存储 - 使用RAII(例如
shared_ptr
)来pipe理NSNumberFormatter
的生命周期
在Objective-C中,这些选项都不可能。 我试图在堆栈上:
NSNumberFormatter fmt;
但是这不能编译。 据我所知,Objective-C中没有RAII的直接等价物。 我可能从一个主要的C ++程序员的angular度来看待这个问题,所以:
- 在一般情况下,在这里处理像
NSNumberFormatter
这样的对象的生活的正确的,惯用的(现代的)Objective-C方法是什么? 我真的必须自己明确吗? - 在具体情况下是否有解决实际问题的更好方法?
像NSString , NSArray等大部分类都有一些便利的构造函数,如[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理有一个清晰的认识!