Iphone objective-C中的自定义初始化方法
如果我正在编写自己的自定义init方法,我会调用什么作为对super init be的适当调用?我有时看到的不仅仅是一些超级init方法,还有一些其他的方法,一般的规则是什么?这取决于上下文,试着放入一些nslog,看看为您调用了哪个init。如果是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调用,以强制实现您的对象的
[super init]
或类似initWithNib…构建您自己的init
方法,您应该调用superinit
,或者如果您的对象与xib关联,您还可以将superinitWithNibName:bundle:
作为shorcut调用,以强制实现您的对象的用户使用一个且仅使用一个xib。在最后一种情况下,还应该重载initWithNibName:bundle:
,以便在调用者使用时进行相同的强制调用
如果您的对象包含在XIB中,还可以重载
initWithCoderObjective-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]”。这样,如果您决定覆盖指定的初始值设定项,您将准备就绪