无论我在哪里读过,它都会在没有调用它的初始化函数的情况下从不使用对象。并且初始化函数总是必须"必须"从" init"开始。
这个命名背后有什么原因(命名一个以init开头的方法做一些特别的事情)?如果我不调用初始化函数,即如果我只是 [MyClass alloc] 并开始使用该对象,会发生什么?
答案 0 :(得分:1)
Alloc
在内存中为您指定的数据类型分配空间。无论是NSString
还是NSNumber
,调用Alloc
都会为该数据类型(小型或大型)保留内存中最有效的空间。
Init
来实例化类和超类的重要变量。这些变量可以包括Rect
重新计算特定大小以布局子视图,或者可能使用某种delegate
实例化以在创建时执行某些协议。如果这一切对你来说太过分了,Objective-C允许你实例化像MyClass *myObject = [MyClass new];
这可能看起来多余而且浪费时间,但幸运的是, Swift 已经在新的编程语言中减少了大量的冗余。现在您所要做的只是var myObject = MyClass()
,如果有任何自定义初始化程序,它们可能会像var myObject = MyClass(frame: CGRectZero)
快乐的编码!
答案 1 :(得分:0)
我建议您在Object Initialization和Initialization上阅读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
答案 2 :(得分:-1)
这是在Objective-C中创建对象的方式。这是语言的一个硬性要求。在Objective-C中创建一个对象是一个两步过程:alloc和init。
在幕后,您必须调用init的原因是,等待它,初始化。
对alloc的调用会为对象创建一个内存块并将其清零。调用init允许对象及其祖先进行设置,以便对象准备好运行。它初始化对象的内存并执行其他设置对象的内务处理。
此外,每个对象的init方法都需要调用super init,因此初始化一直到对象链,一直到NSObject。所有的祖先类都被设计为假设它们的init方法被调用。