在目标C中使用alloc的目的

时间:2013-03-25 16:04:59

标签: objective-c

之间有什么区别
 NSNumber *number = [[NSNumber alloc]initWithInt:13];

NSNumber *number = [NSNumber initWithInt:13];

为什么在两者都解决相同的目的时才进行分配?

2 个答案:

答案 0 :(得分:12)

[NSNumber initWithInt:]无效,因为-initWithInt:实例方法,您将其发送到[NSNumber numberWithInt:]会起作用,但那可能是[[NSNumber alloc] initWithInt:]附近的便利包装。

基础(以及在它上面构建的所有东西,包括UIKit,也可能是你自己在iOS应用程序中的类)使用two-stage creation技术。 +alloc方法只负责为您的实例分配足够的内存,并设置一个指针,指出它是一个实例的类。然后,可以使用-init(或-init…)方法完成自定义设置。

此系统的优点是您的自定义初始化程序不必关心为对象分配内存。缺点是客户端代码必须调用两个阶段,这就是创建+new+numberWithInt:等便捷构造函数的原因。

在更高级别,两阶段创建过程也用于支持类群集,如NSArrayNSNumber,其中使用的确切类型不是知道,直到调用初始化。 +alloc可以返回占位符对象,然后在第二阶段替换自己。

答案 1 :(得分:2)

格雷厄姆·李已经给出了正确答案,这就是为什么你应该接受它作为正确的答案。如今,我认为[NSNumber numberWithInt:42];只是[[NSNumber alloc] initWithInt:42]

的捷径