【问题标题】:Objective-C Why use init?Objective-C 为什么使用 init?
【发布时间】:2013-04-24 05:28:47
【问题描述】:

我正在阅读我的第一本关于 Objective-C 的书 [Objective-C 第 4 版编程],我已经读到一半了,但让我感到困扰的是,它没有解释我们为什么要初始化对象。

我尝试使用 with 对象,例如分配它们的内存但不启动它们,并且程序中的所有内容都与以前一样工作。

我也很欣赏一些解释这一点的例子。

【问题讨论】:

  • 你到底想要什么?
  • 关于初始化对象对对象的意义/实现的解释。

标签: objective-c object init


【解决方案1】:

init 方法中的代码是特定于类的 - 它执行该特定类所需的任何初始化。在某些情况下,类不需要执行任何初始化,因此删除此方法调用将无效。

但是,按照惯例,您应该始终使用 init - 如果将来有人要向类添加一些必需的初始化代码怎么办?

另见:

alloc and init what do they actually do

【讨论】:

    【解决方案2】:

    为了解决你所说的“一切正常”,Objective-C 的有趣之处在于 alloc 将所有实例变量设置为 nil,并且向 nil 发送消息不会做任何事情,它只是返回 nil,所以在大多数情况下在你尝试做非法的事情之前你不会发现问题的情况,考虑这样的课程

    @interface MyObject : NSObject
    @property (nonatomic, strong) NSString *string;
    @end
    
    @implementation MyObject
    @end
    

    现在,如果我们将其分配为:

    MyObject *m = [MyObject alloc];
    

    实例变量_string 或属性string 将为nil,我们可以向它发送不同的消息,例如[string length] 而不会造成任何伤害,因为发送给nil 的消息等于nil。

    但是假设我们想把这个字符串添加到数组中,比如

    @[m.string]
    

    现在你会得到一个例外,因为 NSArray 不能包含 nil,只能包含完整的对象。您可以通过在 MyObject.init 中初始化您的值来轻松解决此问题。

    相当人为的例子,但希望能说明为什么当你不初始化时一切都不会中断:)

    【讨论】:

      【解决方案3】:

      永远不要直接使用alloc 的返回值而不是使用[[Class alloc] init] 的返回值的主要原因之一是init 可能返回与alloc 不同的对象。

      Apple 的文档中提到了这一点:

      注意: init 可能返回与之前不同的对象 由 alloc 创建,因此最好嵌套调用,如图所示。 永远不要在不重新分配任何指针的情况下初始化对象 目的。例如,不要这样做:

      NSObject *someObject = [NSObject alloc];
      [someObject init];
      

      如果对 init 的调用返回了其他对象,您将得到一个 指向最初分配但从未分配过的对象的指针 初始化。

      来源:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多