我为什么不分开alloc和init?

2 convention allocation initialization objective-c

在Objective-C中初始化和分配的常规方法是

NSObject *someObject = [[NSObject alloc] init];
Run Code Online (Sandbox Code Playgroud)

为什么以下没有练习?

NSObject *someObject = [NSObject alloc];
[someObject init];
Run Code Online (Sandbox Code Playgroud)

Nik*_*uhe 9

主要问题是您最终可能会使用错误的对象.

init在许多类中都很特殊,因为它可能只是释放接收器而是创建一个驻留在不同地址的新对象.所以你的someObject指向错误的(未初始化的)实例.

有很多框架类使用init方法的参数来决定哪种专用子类最好使用.这种情况经常发生在类集群中,NSString或者NSArray它可能真的发生在每种对象上.

您可以在其中看到初始化程序的这种特殊行为的地方是ARC:它明确声明init方法系列会占用接收器并返回+1保留对象.如果初始化器只是总是返回接收器,则不需要这样做.

当然,您可以通过执行另一项任务来修复代码:

NSObject *someObject = [NSObject alloc];
someObject = [someObject init];
Run Code Online (Sandbox Code Playgroud)

这样可以解决问题.但这样做也没有任何意义.