为什么alloc和init可能在创建新对象时返回不同的对象?

时间:2014-12-01 13:46:18

标签: ios objective-c

正如ios的文档所说,我们应该在

之后创建一个新对象
NSObject *newObject = [[NSObject alloc] init];

永远不要创建像这样的对象

NSObject *someObject = [NSObject alloc];
[someObject init];

它说init可能返回的不同于alloc,所以我很困惑为什么或在什么情况下它们返回不同的对象?谢谢!

3 个答案:

答案 0 :(得分:2)

允许此行为,以便您的类可以为正在创建的对象生成替代对象。您可能希望这样做有几个原因:

  • 对象缓存 - 如果需要经常创建和释放相同的对象,例如,在为数值创建包装器对象时,可以存储对象实例以供重用,并在请求时返回它们。如果使对象不可变,则可以通过共享对象来节省大量内存。
  • 返回子类 - 执行此操作有多种设计原因,例如,实现与要返回的对象的接口兼容的隐藏功能,例如copy-on-write。
  • 返回nil - 您可以执行此操作来指示init功能失败。

答案 1 :(得分:0)

因为

NSObject * someObject = [NSObject alloc];

所有alloc都为对象分配内存。在这个时间点,没有实际的NSObject类型,只是一个内存区域。如果你立即调用init但是你可能没有意识到init没有被调用并尝试在没有初始化的情况下使用该对象,这没有任何直接后果。

另一个答案有更好的理由,你可能无法从init获得相同的对象。

答案 2 :(得分:0)

以NSString类的大量initWith ...方法为例。有些是非常专业的,并且想要返回一个专门的对象。 alloc不知道那个。所以[NSString alloc]返回一个通用的NSString对象,每个initWith方法都可以返回一些专用对象。