5

有没有在 Cocoa 中总是被调用的方法?许多类都有initor initWith,但更糟糕的是,它们可以从 nib 或其他东西加载。在这种情况下,我不想四处寻找它是如何做到的。我只想设置一些初始变量和其他东西,并且我想要一个方法来子类化,无论它是 a还是等UIView,我都可以依赖它。UIViewControllerUITableViewCell

4

3 回答 3

9

不,没有这样的方法。 init来自NSObject所以每个对象都可以使用它,并且子类也定义了自己的初始化方法。 UIView,例如,定义initWithFrame:,此外还有来自协议的 init 方法,例如NSCodingwhich 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];
    }
}
于 2012-08-01T01:30:39.570 回答
0

不是 100% 肯定它总是被调用,但我很确定这是一个可行的选择。老实说,我不记得我曾在实践中看到过这种方法,而且我通常会回避使用这种方法(我完全不知道为什么,可能是因为它不是最干净和最全面的实现方法这个...):

-didMoveToSuperview()

从文档:

告诉视图其超级视图已更改。此方法的默认实现什么也不做。每当父视图更改时,子类可以覆盖它以执行其他操作。

于 2015-04-04T15:05:33.393 回答
-1

有很多方法可以编写自定义初始化程序。

- (id)initWithString:(NSString *)string {
    if((self == [super init])) {
        self.string = string;
    }
    return self;
}

这就是我编写初始化程序的一般方式。例如,上面的那个需要一个字符串。(如果你不想,你不必传递字符串)。

顺便说一句,init 是一种方法。根据 NSObject 的标头,init 有一个方法实现。

于 2012-08-01T23:35:07.257 回答