2013-04-24 24 views
1

我正在阅读我关于Objective-C [编程Objective-C第4版]的第一本书,我在这本书的中途,但有一件事让我感到困扰,就是它没有解释为什么我们初始化对象。Objective-C为什么使用init?

我试着玩与对象,例如分配他们的内存,但不启动它们,程序中的所有内容都与以前一样。

我会很感激一些例子解释这一点,也。

+0

正是你想要什么? – 2013-04-24 05:32:08

+0

初始化对象对于对象意味着什么/达到什么的解释。 – 2013-04-24 05:38:07

回答

6

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

但是,按照惯例,你应该总是使用init--如果有人在将来为某个类添加一些必需的初始化代码,该怎么办?

参见:

alloc and init what do they actually do

3

为了解决你的“一切正常”的观点,对Objective-C的有趣的事情是,页头将所有的实例变量为零,并且将消息发送到零没有按”采取任何动作,只是返回nil,所以在大多数情况下,你不会看到一个问题,直到你会尝试做一些非法的,认为这样

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

@implementation MyObject 
@end 

类现在,如果我们只希望它页头如:

MyObject *m = [MyObject alloc]; 

实例变量_string或财产string将是零,我们可以发送不同的消息给它,就像[string length]无任何伤害,因为消息到零等于无。

但且说我们希望这个字符串添加到阵列,像

@[m.string] 

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

漂亮人为的例子,但希望表明的,为什么当你不初始化:)

1

其中一个主要的原因,你不应该使用alloc的返回值,而不是直接的一切不破点使用[[Class alloc] init]的返回值是init可能会返回与alloc不同的对象。

苹果的文件提到了这一点:

注:这是可能的init返回一个不同的对象不是被ALLOC创建 ,所以最好的做法嵌套调用,如图所示。 永远不要初始化一个对象,而不要重新指定任何指向该对象的指针。作为一个例子,不这样做:如果调用初始化返回一些其他对象

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

,你会留下一个 指针最初分配的对象,但从来没有 初始化。

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

相关问题