[英]Is there a init method in iOS that is always called?
是否有一个总是在Cocoa中调用的方法? 许多类都有init
或initWith
,但更糟糕的是它们可以从nib或其他东西加载。 在这种情况下,我不想在周围找到它是如何做到的。 我只是想设置一些初始变量和其他东西,我想要一个子类的方法,我可以依赖它,无论它是UIView
, UIViewController
还是UITableViewCell
等。
不,没有这样的方法。 init
来自NSObject
因此每个对象都可以使用它,并且子类定义它们自己的初始化方法。 例如, UIView
定义了initWithFrame:
此外还有来自协议的init方法,例如定义initWithCoder:
NSCoding
initWithCoder:
. 这是Objective-C的动态特性,任何东西都可以随时扩展。 话虽如此,有一些模式。 UIViewController
几乎总是采用initWithNibName:bundle:
而UIView
几乎总是采用initWithFrame:
或initWithCoder:
. 我所做的是制作一个内部初始化方法,让其他人调用它。
- (void)initialize
{
//Do stuff
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
[self initialize];
}
}
- (id)initWithCoder:(NSCoder *)aCoder
{
self = [super initWithCoder:aCoder];
if(self)
{
[self initialize];
}
}
不是100%肯定它总是被调用,但我很确定这是一个可行的选择。 说实话,我不记得我曾经见过这种方法在实践中使用过,我常常回避使用这种方法(我完全不知道为什么,可能是因为它不是最干净,最全面的方法来实现这个...):
-didMoveToSuperview()
来自文档:
告诉他们超级视图发生了变化。 此方法的默认实现不执行任何操作。 每当superview更改时,子类都可以覆盖它以执行其他操作。
您可以通过多种方式编写自定义初始化程序。
- (id)initWithString:(NSString *)string {
if((self == [super init])) {
self.string = string;
}
return self;
}
这就是我一般编写初始化器的方式。 例如,上面的一个字符串。 (如果你不想要,你不必传递字符串)。
顺便说一句,init是一种方法。 根据NSObject的头文件,init有一个方法实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.