ios - 关于使用 init 方法

标签 ios objective-c

我制作了一个测试应用程序来了解 init 方法的工作原理。在我的简单 UIViewController我称之为:

- (id)init {
    self = [super init];
     self.propertyArray = [NSArray new];
    NSLog(@"init called");
    return self;
}

上面没有打印 NSLog 中的任何值。但是,当我写:
- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    NSLog(@"init called");
    self.propertyArray = [NSArray new];
    return self;
}

它确实在控制台中打印“init call”。所以我的问题是:为什么调用 init 方法而另一个没有?当我想在 View 加载(以及任何其他调用的方法)之前做我的事情时,我必须使用哪一个?

任何解释将不胜感激,谢谢。

最佳答案

首先,您在问题中提到了 ViewController。 UIViewController 的指定初始化器是 initWithNibName:bundle:

你永远不想只覆盖 UIViewController 上的 init。

每个对象都有一个生命周期:

在代码中初始化时,您有指定的初始化程序。您可以在该类的文档中找到它。对于 NSObject 派生类,这将是 init:

- (id)init
{
    self = [super init];
    if (self) {
        // perform initialization code here
    }
    return self;
}

使用 NSKeyUnrchiving 反序列化的所有对象(在 Storyboard 或 NIB(XIB)的情况下会发生这种情况)都会被解码。此过程使用 initWithCoder 初始化程序并在取消归档过程中发生:
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // perform initialization code here
    }
    return self;
}

由于这个生命周期,创建一个从每个初始化程序调用的共享初始化程序是很常见的:
- (void)sharedInit
{
    // do init stuff here
}

- (id)init
{
    self = [super init];
    if (self) {
        [self sharedInit];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self sharedInit];
    }
    return self;
}

更进一步。在 Storyboard 和 XIB 的情况下,如果您想在取消归档完成后执行初始化或更新并确保所有导出和操作都已连接,您可以使用 awakeFromNib:
- (void)awakeFromNib
{
    // do init or other stuff to be done after class is loaded from Interface Builder
}

关于ios - 关于使用 init 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24761444/

相关文章:

ios - 即使使用 Cordova WKWebview Engine 插件的基本 Ionic 项目也会产生白屏

iOS9 UIWebView 黑屏

ios - objective-c - 如何确保 block 在进一步执行任何其他代码之前执行?

ios - Facebook iOS SDK 3.1 : "Error: HTTP status code: 400"

objective-c - 为什么 LLDB 使用我的结构的错误字段进行算术运算?

ios - 无法在设备上安装 Xcode Server bot 生成的 ipa

objective-c - Xcode 8.1 未检测到何时未定义 Objective-c 方法

ios - 在调整 UIScrollView 大小时调整内容比例和偏移量

iphone - ViewController = _ViewController 的意思

iPhone:如何附加到文本文件的末尾?