在目标C中使用alloc的目的

sta*_*kid 3 objective-c

有什么区别

 NSNumber *number = [[NSNumber alloc]initWithInt:13];
Run Code Online (Sandbox Code Playgroud)

NSNumber *number = [NSNumber initWithInt:13];
Run Code Online (Sandbox Code Playgroud)

当两者都解决相同的目的时为什么要分配?

小智 12

[NSNumber initWithInt:]将无法工作,因为它-initWithInt:是一个实例方法,你将它发送到.[NSNumber numberWithInt:]会工作,但那可能是一个方便的包装[[NSNumber alloc] initWithInt:].

基础(以及在其上构建的所有内容,包括UIKit以及可能在iOS应用程序中也可能是您自己的类)使用两阶段创建技术.该+alloc方法负责为您的实例分配足够的内存,并设置一个指针,指出它是哪个类的实例.然后可以在-init(或-init…)方法中完成自定义设置.

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

在更先进的水平,这两个阶段的创作过程也被用于支持类簇NSArrayNSNumber,那里的确切类型使用是不知道,直到初始化器被调用.+alloc可以返回占位符对象,然后在第二阶段替换自身.

  • 从历史上看,分离用于允许通过不同分配器分配的内存然后被初始化为对象.这很久以前就被抛弃了,因为在解除分配时它太脆弱了.两阶段分配器还允许类在初始化时返回不同的,通常缓存的已存在的实例(这是类集群中的常见行为,但与集群正交). (3认同)