当我们在子类的init方法实现中执行self = [super init];
时,
我不明白为什么它不是self= [[super alloc] init];
在第一种情况下,你怎么能初始化你没有为内存分配的东西?
这是因为你实际上并没有初始化超类对象,而是使用超类的init方法首先自己创建吗?
如果是这样,我们在何时何地为自己分配记忆?
在调用这个init方法之前,是否假设我们在程序中的其他地方执行了alloc?
语法基本上是[subclass initUsingMySuperClassImplementationFirst]
?
答案 0 :(得分:9)
我不明白为什么它不是
self= [[super alloc] init];
因为当init
被调用时,其他人已经已经分配了内存。
请注意,alloc
是一种类方法,init
是一种实例方法。调用init
时,已创建对象。
例如:
MyObject *someObject = [[MyObject alloc] init];
alloc
创建并返回已分配的MyObject
。 init
只是设置 - 初始化任何自定义属性等。
这相当于:
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
的末尾分配了超出范围的内存,这是一件坏事。