繁体   English   中英

在iOS中是否有一个始终被调用的init方法?

[英]Is there a init method in iOS that is always called?

是否有一个总是在Cocoa中调用的方法? 许多类都有initinitWith ,但更糟糕的是它们可以从nib或其他东西加载。 在这种情况下,我不想在周围找到它是如何做到的。 我只是想设置一些初始变量和其他东西,我想要一个子类的方法,我可以依赖它,无论它是UIViewUIViewController还是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM