【问题标题】:Why init.. methods are required in Objective C?为什么在 Objective C 中需要 init.. 方法?
【发布时间】:2015-08-02 09:58:43
【问题描述】:

无论我读过什么,它都被写成在不调用它的初始化函数的情况下永远不要使用一个对象。并且初始化函数总是“必须”以“init”开头。

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

【问题讨论】:

  • 过去你使用什么编程语言?
  • 你知道一种使用init方法的O-O语言吗?

标签: ios objective-c


【解决方案1】:

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

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

这似乎都是多余和浪费时间,但幸运的是 Swift 已经在新的编程语言中减少了大量这样的冗余。现在你所要做的就是var myObject = MyClass(),如果有任何自定义初始化器,它们可能会像这样写var myObject = MyClass(frame: CGRectZero)

编码愉快!

【讨论】:

    【解决方案2】:

    我建议阅读 Object InitializationInitialization 上的 Apple 文档。

    这种命名背后有什么原因吗(命名以 init 开头的方法有什么特别的作用吗)?

    这是约定,以 init 开头的方法名并没有什么特别的作用。

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

    如果我不调用初始化函数,即如果我只是执行 [MyClass alloc] 并开始使用该对象,会发生什么?

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

    举个小例子,如果您使用以下类调用 [[MyObject alloc] vegetable];,您将得到 nil 返回,因为 _vegetable 尚未分配。

    @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
    

    【讨论】:

      【解决方案3】:

      这是您在 Objective-C 中创建对象的方式。这是语言的硬性要求。在 Objective-C 中创建对象是一个两步过程:alloc 和 init。

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

      对 alloc 的调用会为您的对象创建一块内存并将其清零。调用 init 允许对象及其祖先进行设置,以便对象准备好运行。它初始化对象的内存并执行其他设置对象的内务处理。

      此外,每个对象的init方法都需要调用super init,所以初始化一直沿着对象链向上,一直到NSObject。所有的祖先类都被设计为假定调用了它们的 init 方法。

      【讨论】:

      • 我可以继承 NSProxy 并在 alloc 中进行初始化吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多