Objective-C默认方法中[super init]
的用法是什么?我们可以在自定义方法中使用它的条件是什么?
答案 0 :(得分:1)
答案 1 :(得分:1)
简而言之:
一个。每个类都有一个(通常)或更多主(指定)初始化器。在进行自己的初始化之前,必须执行super的主要初始化程序之一。例如,NSObject
-init
是主要的初始化程序。如果您的子类为NSObject
,则必须在执行自己的初始化之前执行init
(NSObject
):
@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
当你有一个方便的初始化程序时,你不发送init
到super
(更一般地说:执行超级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]
,然后添加自定义初始化代码。