1

I'm reading my first book on Objective-C [Programming in Objective-C 4th Edition], I'm midway through the book but one thing that bugs me, is that it didn't explain WHY we initialize objects.

I tried playing around with the with objects, for example allocating their memory but not initiating them and everything in the program works the same as before.

I'd appreciate some example explaining this, also.

4

3 回答 3

6

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

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

也可以看看:

alloc 和 init 他们实际上做了什么

于 2013-04-24T05:36:48.013 回答
3

为了解决“一切正常”的问题,关于 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 中初始化您的值来轻松解决此问题。

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

于 2013-04-24T05:44:46.067 回答
1

alloc永远不要直接使用 ' 返回值而不是使用' 返回值的主要原因之一[[Class alloc] init]是它init可能返回与alloc.

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

注意: init 可能返回与 alloc 创建的对象不同的对象,因此最好按所示嵌套调用。切勿在未重新分配指向该对象的任何指针的情况下初始化对象。例如,不要这样做:

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

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

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

于 2013-04-24T06:29:29.297 回答