Objective-C为什么使用init?

Objective-C为什么使用init?,objective-c,object,init,Objective C,Object,Init,我正在读我的第一本关于Objective-C的书【Objective-C编程第四版】,我正在读这本书的中途,但有一件事让我感到困扰,那就是它没有解释我们初始化对象的原因 我试着和对象一起玩,例如分配它们的内存,但不启动它们,程序中的所有东西都和以前一样工作 我也希望有一些例子来解释这一点。init方法中的代码是特定于类的-它执行特定类所需的任何初始化。在某些情况下,类不需要执行任何初始化,因此删除此方法调用不会产生任何效果 然而,按照惯例,您应该始终使用init—如果将来有人要向类添加一些必需的

我正在读我的第一本关于Objective-C的书【Objective-C编程第四版】,我正在读这本书的中途,但有一件事让我感到困扰,那就是它没有解释我们初始化对象的原因

我试着和对象一起玩,例如分配它们的内存,但不启动它们,程序中的所有东西都和以前一样工作


我也希望有一些例子来解释这一点。

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

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

另见:


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

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

另见:


为解决所有的问题,ObjuleC的有趣之处在于,OLLC将所有实例变量设置为零,并且将消息发送到NIL没有任何作用,它只返回NIL,所以在大多数情况下,除非您尝试做非法的事情,否则不会看到问题,请考虑这样的类

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

@implementation MyObject
@end
现在,如果我们将其分配为:

MyObject *m = [MyObject alloc];
实例变量_string或属性string应该是nil,我们可以向它发送不同的消息,比如[string length],而不会造成任何伤害,因为message to nil等于nil

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

@[m.string]
现在您将得到一个异常,因为NSArray不能包含nil,只能包含完整的对象。通过在MyObject.init内初始化值,可以轻松解决此问题


非常做作的例子,但希望能说明为什么当你不初始化时一切都不会中断:

为了说明一切都有效的原因,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],而不会造成任何伤害,因为message to nil等于nil

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

@[m.string]
现在您将得到一个异常,因为NSArray不能包含nil,只能包含完整的对象。通过在MyObject.init内初始化值,可以轻松解决此问题


这是一个精心设计的示例,但希望能说明为什么不初始化时一切都不会中断:

不应该直接使用alloc的返回值而不是使用[[Class alloc]init]的返回值的一个主要原因是init可能会返回与alloc不同的对象

苹果的文档中提到:

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

NSObject *someObject = [NSObject alloc];
[someObject init];
如果对init的调用返回其他对象,那么您将得到一个 指向最初分配但从未分配的对象的指针 初始化


来源:

不应该直接使用alloc的返回值而不是使用[[Class alloc]init]的返回值的一个主要原因是init可能返回与alloc不同的对象

苹果的文档中提到:

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

NSObject *someObject = [NSObject alloc];
[someObject init];
如果对init的调用返回其他对象,那么您将得到一个 指向最初分配但从未分配的对象的指针 初始化


来源:

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