NSNumber numberWithFloat vs Init和alloc

时间:2012-01-31 01:39:30

标签: ios objective-c xcode

我有这行代码,并试图找出我编写它的方式的优缺点。我只是想设置一个浮动值的标签,两者都有效....只是不知道哪个更好......

self.display.text=[[NSNumber numberWithFloat:32.445] stringValue];

说有什么不同吗

NSNumber *number = [[NSNumber alloc]initWithFloat:32.445];
self.display.text = [number stringValue];

嗯 - 我知道必须有区别 - 只是不确定它会是什么。好像第一个更像是一个包装器(如果有意义的话)?

感谢!!!

6 个答案:

答案 0 :(得分:9)

[NSNumber numberWithFloat:32.445]

相当于:

[[[NSNumber alloc] initWithFloat:32.445] autorelease]

在手动参考计数模式下。在ARC或GC模式下,您可以认为它等同于:

[[NSNumber alloc] initWithFloat:32.445]

您可能获得的唯一好处是尝试避免在MRC模式下调用autorelease并将其替换为release来电。

答案 1 :(得分:2)

  

似乎第一个更像是一个包装器(如果有意义的话)?

这是完全它在大多数实现中的含义,并禁止转角情况= p它被称为便利构造函数。

你应该更喜欢哪种 - 对你来说更清楚。我更喜欢alloc + init因为它更容易管理内存并且需要稍微减少开销(除了极端情况)。

如果您知道有很多对象需要编写或正在编写性能/内存关键代码( cough iOS设备),那么您应该考虑使用alloc + init来代替“更重”的代码。

答案 2 :(得分:1)

numberWithFloat:选择器在NSNumber上调用类方法(非常类似于Java,C#或C ++中的静态方法)。 initWithFloat:选择器调用特定NSNumber对象上的实例方法。您使用[NSNumber alloc]将实例设置为init。

(有关详情,请参阅Apple's docs。)

将静态方法视为第二种形式的包装是绝对公平的,因为某处某人必须调用alloc

答案 3 :(得分:1)

除非您在ARC下运行,否则在后一种情况下需要[编号发布]。对于一次性使用,那么,前一种情况 - 使用+ numberWithFloat: - 可能更可取(更少的输入=更少的错误,更清晰的代码)。

我能想到的唯一真正的区别是,如果您在某些性能关键型应用程序中使用它们,尤其是涉及循环的地方,则在决定是否使用类或实例方法时会有更复杂的内存优化注意事项。然而这些并不适用于这里(大概这是UI代码),所以只需简化你的生活并使用+ numberWithFloat:。

答案 4 :(得分:1)

如果您正在使用ARC,那么我认为两种方式都相同。

如果您在没有ARC的情况下工作,就像大多数obj-c开发人员已经完成的那样,那么您的第二个片段会泄漏内存,您可以考虑这样写:

NSNumber *number = [[[NSNumber alloc]initWithFloat:32.445] autorelease];

答案 5 :(得分:0)

使用alloc / initWithFloat方法,我相信'number'必须在某个地方发布。