Ios 为什么在子类init方法实现中不需要[super alloc]?
当我们做Ios 为什么在子类init方法实现中不需要[super alloc]?,ios,objective-c,Ios,Objective C,当我们做self=[super init]
self=[super init]在我们的子类的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。但是,是的,asalloc
返回实例化的对象。当您在方法的实现中引用self时,您指的是该方法正在/将要发送到的对象?我说的对吗?您指的是“拥有”该方法的对象,即您正在调用该方法的对象。