gpt4 book ai didi

iphone - 类似于 RAII 的惯用短生命周期本地对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:33:47 25 4
gpt4 key购买 nike

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

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

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

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

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

NSNumberFormatter fmt;

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

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

最佳答案

大多数类,如 NSStringNSArray 等,都有方便的构造函数,如 [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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com