Iphone objective-C中的自定义初始化方法

Iphone objective-C中的自定义初始化方法,iphone,objective-c,ipad,Iphone,Objective C,Ipad,如果我正在编写自己的自定义init方法,我会调用什么作为对super init be的适当调用?我有时看到的不仅仅是一些超级init方法,还有一些其他的方法,一般的规则是什么?这取决于上下文,试着放入一些nslog,看看为您调用了哪个init。如果是[super init]或类似initWithNib…构建您自己的init方法,您应该调用superinit,或者如果您的对象与xib关联,您还可以将superinitWithNibName:bundle:作为shorcut调用,以强制实现您的对象的

如果我正在编写自己的自定义init方法,我会调用什么作为对super init be的适当调用?我有时看到的不仅仅是一些超级init方法,还有一些其他的方法,一般的规则是什么?

这取决于上下文,试着放入一些nslog,看看为您调用了哪个init。如果是
[super init]
或类似initWithNib…

构建您自己的
init
方法,您应该调用super
init
,或者如果您的对象与xib关联,您还可以将super
initWithNibName:bundle:
作为shorcut调用,以强制实现您的对象的用户使用一个且仅使用一个xib。在最后一种情况下,还应该重载
initWithNibName:bundle:
,以便在调用者使用时进行相同的强制调用


如果您的对象包含在XIB中,还可以重载
initWithCoder

Objective-C类可能有多个
init
方法。通常,其中一个被称为“指定初始值设定项”,并且是所有其他调用的初始值设定项

如果您正在子类化,并创建一个具有不同签名的
init
方法,则应该调用超类的指定初始值设定项(尽管调用超类的任何初始值设定项也可以)。这些类的文档通常会告诉您指定的初始值设定项是什么


例如,在
UITableViewCell
中,指定的初始值设定项是
initWithStyle:reuseIdentifier:
,如果您使用不同的签名对
init
方法进行子类化并创建一个
init
方法,则应该调用该初始值设定项。

一般规则是,初始化类时应该调用
[super init]
。这样,您继承的类(通常是NSObject)的init方法也将被调用,并由此构造。如果所有类都遵循此规则,则将建立一个init链


dealloc中也有相同的规则,在这里您调用了
[super dealloc]

,所以它取决于调用的是哪个super init?如果我在super中有两个init怎么办。。我不知道调用的是哪一个?尝试将
(id)init
(id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
添加到类中,如果它们不存在。在这两个方法中都插入一个NSLog,看看当它现在被初始化时,你的代码调用了哪一个。XIB中包含了什么对象,你的意思是如果我将UILabel子类化并且UILabel在XIB上?@xonegirlz:是的,这就是我的意思。任何人也可以将任何非图形对象放入xib(我不是要将视图放入xib,而是xib本身),更改其class属性以引用NSString或其他任何内容,并将其链接到IBOutlet以在实例化xib时实例化对象。这不是一个好规则。一般规则是调用超类的指定初始值设定项。例如,如果您的类继承自UIView,那么您应该调用
[super initWithFrame:
。我认为最好是在self上调用指定的初始值设定项,而不是super,除非您正在编写一个名为“init”的简单初始值设定项。因此initWithBlah:应该调用“self=[self init]”而不是“self=[super init]”。这样,如果您决定覆盖指定的初始值设定项,您将准备就绪