何时使用[Super init] iOS

时间:2015-03-13 09:29:59

标签: ios objective-c

Objective-C默认方法中[super init]的用法是什么?我们可以在自定义方法中使用它的条件是什么?

3 个答案:

答案 0 :(得分:1)

您在实现的所有子类中都使用[super init],这些子类也包含-init,-initWith ...方法。

它'确保在您之前执行父类代码。

Details explanations

答案 1 :(得分:1)

简而言之:

一个。每个类都有一个(通常)或更多主(指定)初始化器。在进行自己的初始化之前,必须执行super的主要初始化程序之一。例如,NSObject -init是主要的初始化程序。如果您的子类为NSObject,则必须在执行自己的初始化之前执行initNSObject):

@interface MyClass : NSObject
…
@end

@implementation MyClass
- (id)init // My primary initializer
{
   // Before I do my own -init, if have to execute super's -init
   self = [super init];
   …
}
@end

如果你的子类有一个新的主初始化器,那么这就成了:

@interface MyClass : NSObject
…
@end

@implementation MyClass
- (id)initMyClassWith… // My primary initializer, that's different from NSObject's
{
   // Before I do my own -initMyClass, if have to execute super's -init
   self = [super init]; 
   // As long, as -init is not overridden, self-init would work by acdident, 
   // but you have to override on a PI change, see below!
   …
}
@end

当你有一个方便的初始化程序时,你发送initsuper(更一般地说:执行超级PI)。在这种情况下,您将消息发送给自己:

@interface MyClass : NSObject
…
@end

@implementation MyClass
- (id)initConvenient // My secondary initializer
{
   self = [self initMyClass]; // primary
   …
}
@end

因此,在PI更改时,您必须覆盖超级PI以使其执行子类'PI:

    @interface MyClass : NSObject
…
@end

@implementation MyClass
- (id)init // subclass' secondary
{
  self = [self initMyClass]; // Primary
   …
}
@end

答案 2 :(得分:0)

当您从超类中覆盖初始值设定项时,必须使用super init。例如,如果您是UIViewController的子类,则调用[super init],然后添加自定义初始化代码。