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

Ios 为什么在子类init方法实现中不需要[super alloc]?,ios,objective-c,Ios,Objective C,当我们做self=[super init]

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

在第一种情况下,如何初始化没有分配内存的东西

这是不是因为您实际上并没有初始化一个超类对象,而是使用超类的init方法首先初始化您自己

如果是这样的话,我们在哪里和什么时候为自己分配了内存

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


语法基本上是说
[subclass initUsingMySuperClassImplementationFirst]

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

这与Java等其他语言中的范例相同
alloc
是一个类方法,而不是实例方法,因此调用
init
的唯一方法是如果已经调用了
alloc

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

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

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

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

例如:

MyObject*someObject=[[MyObject alloc]init]

alloc
创建并返回已分配的
MyObject
<代码>初始化
只需设置-初始化任何自定义属性等

这相当于:

MyObject *someObject = [MyObject alloc];
someObject = [someObject init];
是否只是假设在调用此init方法之前,我们在程序中的其他地方执行了alloc

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

MyObject*someObject=[MyObject init]


这是行不通的,因为
init
是一个实例方法,而不是类方法。(如果您想了解更多有关差异的信息,请参阅。)

那么,在本例中,self是由
[MyObject alloc]
创建的对象吗?然后self在重写super的实现之前,继续在自己的init方法中使用超类的init方法?在
init
方法的开头,已经分配了
self
self=[super init]
允许超类执行所需的初始化(如果有)。但是如果跳过这一部分,您仍然可以从
self
开始,并可以初始化对象等。有关该问题的答案,请参阅
alloc
的文档@user3142893。但是,是的,as
alloc
返回实例化的对象。当您在方法的实现中引用self时,您指的是该方法正在/将要发送到的对象?我说的对吗?您指的是“拥有”该方法的对象,即您正在调用该方法的对象。