ios - 如果我们不在 init 方法中检查 "if (self)"会发生什么?

标签 ios objective-c self

<分区>

我开始研究我们学长做的代码,我发现 init 方法总是有代码 -(id)init 方法。他们通过以下方式使用代码。以下代码用于所有 View Controller 。

    self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
    return self;

这部分的if(self)self有什么用?

    //And in some viewcontroller contains.
    self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
    if (self) {
        //Do some stuff
    }
    return self;

最佳答案

当您在方法中访问实例变量时,代码等同于通过自指针寻址它们:

- (void)method {
  iVar = 1;
  // actually the following line will be executed:
  self->iVar = 1;
}

因此,如果由于某种原因 self 指针为 nil 而您在 init 方法中访问您的 ivars,您的应用程序将崩溃,因为您将尝试取消引用空指针。例如以下简单示例将崩溃:

@implementation TestObj {
  int a;
}

- (id) init {
  self = [super init];
  self = nil;

  a = 1; // Crash
  return self;
}
@end

此外,如果您的 [super init] 方法出于任何原因返回 nil,这可能表明出现了问题,您不应继续进行对象初始化和任何其他需要的工作。

关于ios - 如果我们不在 init 方法中检查 "if (self)"会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22608435/

相关文章:

ios - 如何获取 Firebase 用户 uuid

list - 在 self 上指定生命周期时,Rust 在 trait 上使用动态多态性的问题

ios - 将 24 位 PNG 图像转换为 GLubytes 数组

objective-c - NSNotification 发送一次,但被多次接收

iphone - tabBar 应用程序在 iPhone 设备上启动非常缓慢

C++ 链表,堆栈(某种)

ruby - 正常方法中的 "self"与单例方法中的 "self"?

ios - 在UIWebView中加载mp3

ios - 如何在 Swift 中为每一帧的流媒体和录制视频添加实时时间戳?

iphone - 我如何使一个表格 View 指向具有另一个表格 View 的页面?