[英]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)
编码愉快!
这种命名背后是否有原因(命名以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.