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

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

这似乎泄漏了NSNumberFormatter。在C++中,我将执行以下两项操作之一:
  • auto(即堆栈)存储用于NSNumberFormatter
  • 使用RAII(例如shared_ptr)来管理NSNumberFormatter的寿命

  • 在Objective-C中,这些选项似乎都不可行。我在堆栈上尝试过:
    NSNumberFormatter fmt;
    

    但这无法编译。据我所知,在Objective-C中没有RAII的直接等效项。作为主要的C++程序员,我可能是从错误的角度看问题,所以:
  • 在一般情况下,这里处理NSNumberFormatter这样的对象生命的正确,惯用(现代)Objective-C方法是什么?我真的必须自己明确地做吗?
  • 在特定情况下,是否有解决实际问题的更好方法?
  • 最佳答案

    大多数类(如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,希望通过它可以对内存管理有个清晰的了解!

    关于iphone - 惯用生命周期短的局部物体,类似于RAII,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7753680/

    10-12 05:55