为什么在子类init方法实现中不需要[super alloc]?

时间:2013-12-28 23:09:06

标签: ios objective-c

当我们在子类的init方法实现中执行self = [super init];时,

我不明白为什么它不是self= [[super alloc] init];

在第一种情况下,你怎么能初始化你没有为内存分配的东西?

这是因为你实际上并没有初始化超类对象,而是使用超类的init方法首先自己创建吗?

如果是这样,我们在何时何地为自己分配记忆?

在调用这个init方法之前,是否假设我们在程序中的其他地方执行了alloc?

语法基本上是[subclass initUsingMySuperClassImplementationFirst]

2 个答案:

答案 0 :(得分:9)

  

我不明白为什么它不是self= [[super alloc] init];

因为当init被调用时,其他人已经已经分配了内存。

请注意,alloc是一种类方法,init是一种实例方法。调用init时,已创建对象。

例如:

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

alloc创建并返回已分配的MyObjectinit只是设置 - 初始化任何自定义属性等。

这相当于:

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

在调用这个init方法之前,是否假设我们在程序中的其他地方执行了alloc?

这不是假设的,而是保证 - 因为没有这样做就不可能到达init。例如,如果您致电:

MyObject *someObject = [MyObject init];

这不起作用,因为init实例方法,而不是方法。 (如果您想了解更多有关差异的信息,请参阅What is the difference between class and instance methods?。)

答案 1 :(得分:0)

原因是因为在调用子类的init方法时,已经为它分配了内存。您不需要为超类分配内存,因为您没有实例化它 - 您正在调用已存在的超类的init方法。 分配实例化之间存在差异。

这与其他语言(如Java)的范例相同。 alloc是一个类方法,而不是一个实例方法,所以init的唯一方法就是调用alloc

实际上,调用[[super alloc] init]可能会产生一个不必要的泄漏对象,因为你已经在init的末尾分配了超出范围的内存,这是一件坏事。