我有这行代码,并试图找出我编写它的方式的优缺点。我只是想设置一个浮动值的标签,两者都有效....只是不知道哪个更好......
self.display.text=[[NSNumber numberWithFloat:32.445] stringValue];
说有什么不同吗
NSNumber *number = [[NSNumber alloc]initWithFloat:32.445];
self.display.text = [number stringValue];
嗯 - 我知道必须有区别 - 只是不确定它会是什么。好像第一个更像是一个包装器(如果有意义的话)?
感谢!!!
答案 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'必须在某个地方发布。