为什么在Objective C中需要init ..方法?

时间:2015-08-01 10:58:57

标签: ios objective-c

无论我在哪里读过,它都会在没有调用它的初始化函数的情况下从不使用对象。并且初始化函数总是必须"必须"从" init"开始。

这个命名背后有什么原因(命名一个以init开头的方法做一些特别的事情)?如果我不调用初始化函数,即如果我只是 [MyClass alloc] 并开始使用该对象,会发生什么?

3 个答案:

答案 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 InitializationInitialization上阅读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方法被调用。