有没有在 Cocoa 中总是被调用的方法?许多类都有init
or initWith
,但更糟糕的是,它们可以从 nib 或其他东西加载。在这种情况下,我不想四处寻找它是如何做到的。我只想设置一些初始变量和其他东西,并且我想要一个方法来子类化,无论它是 a还是等UIView
,我都可以依赖它。UIViewController
UITableViewCell
3 回答
不,没有这样的方法。 init
来自NSObject
所以每个对象都可以使用它,并且子类也定义了自己的初始化方法。 UIView
,例如,定义initWithFrame:
,此外还有来自协议的 init 方法,例如NSCoding
which defined initWithCoder:
。这就是 Objective-C 的动态特性,任何东西都可以随时扩展。话虽如此,有一些模式。 UIViewController
几乎总是取initWithNibName:bundle:
并且UIView
几乎总是取initWithFrame:
or 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()
从文档:
告诉视图其超级视图已更改。此方法的默认实现什么也不做。每当父视图更改时,子类可以覆盖它以执行其他操作。
有很多方法可以编写自定义初始化程序。
- (id)initWithString:(NSString *)string {
if((self == [super init])) {
self.string = string;
}
return self;
}
这就是我编写初始化程序的一般方式。例如,上面的那个需要一个字符串。(如果你不想,你不必传递字符串)。
顺便说一句,init 是一种方法。根据 NSObject 的标头,init 有一个方法实现。