繁体   English   中英

为什么目标C需要init ..方法?

[英]Why init.. methods are required in Objective C?

无论在何处阅读,它都被编写为在不调用其初始化函数的情况下从不使用对象。 而且初始化函数总是“必须”以“ init”开头。

这种命名背后是否有原因(命名以init开头的方法是否有特殊之处)? 如果不调用初始化函数,即仅执行[MyClass alloc]并开始使用该对象,该怎么办?

调用Alloc可以为您指定的数据类型在内存中分配空间。 无论是NSString还是NSNumber ,调用Alloc都会为该数据类型(较小或较大)保留内存中最有效的空间。

调用Init来实例化类和超类的重要变量。 这些变量可以包括Rect以便重新计算特定大小以布局子视图,或者可以实例化某种delegate以在创建时执行某种协议。 如果这一切对您来说太大了,Objective-C确实可以实例化MyClass *myObject = [MyClass new];

这看起来似乎都是多余的,而且很浪费时间,但是幸运的是, Swift在新的编程语言中减少了这样的大量冗余。 现在,您要做的就是var myObject = MyClass() ,如果有任何自定义初始化程序,则可能会像这样写var myObject = MyClass(frame: CGRectZero)

编码愉快!

我建议阅读有关对象初始化初始化的Apple文档。

这种命名背后是否有原因(命名以init开头的方法是否有特殊之处)?

按照惯例,以init开头的方法名称不会做任何特殊的事情。

有一些小怪癖,例如,以init开头的方法返回的类型为id ,编译器会将返回类型转换为instancetype ,但是这些值得一提。

如果不调用初始化函数,即仅执行[MyClass alloc]并开始使用该对象,该怎么办?

如果您使用标准的SDK类,则很可能会遇到崩溃/异常。 初始化用于设置实例变量的初始状态,否则可能导致未定义的行为。

举个小例子,如果您调用了[[MyObject alloc] vegetable]; 使用以下类,由于未分配_vegetable,您将得到nil。

@interface MyObject : NSObject

-(NSString*)vegetable;

@end

@implementation MyObject {
    NSString *_vegetable;
}

-(instancetype)init {
    self = [super init];
    if (self) {
        _vegetable = @"Cabbage";
    }
    return self;
}

-(NSString*)vegetable {
    return _vegetable;
}

@end

这是在Objective-C中创建对象的方式。 这是语言的硬性要求。 在Objective-C中创建对象是一个两步过程:分配和初始化。

在幕后,必须调用init的原因是等待初始化。

调用alloc将为您的对象创建一个内存块并将其清零。 调用init允许对象及其祖先进行设置,以便对象可以正常运行。 它初始化对象的内存并执行其他整理对象的操作。

此外,每个对象的init方法都需要调用super init,因此初始化过程一直贯穿对象链,一直到NSObject。 所有祖先类均设计为假定调用了它们的init方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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