alloc和init是否创建了2个类的实例?

时间:2014-08-07 12:56:29

标签: objective-c memory-management init alloc

我最近从Programming Objective C,第4版学习objective-c。 阅读部分时我有疑问:

myFraction = [Fraction alloc];
myFraction = [myFraction init];
  

当您将alloc消息发送到类时,您将返回该类的新实例。保证alloc方法将所有对象的实例变量清零。但是,这并不意味着对象已正确初始化以供使用。您需要在分配对象后对其进行初始化。

     

同样,你在这里使用的方法是你自己没有写的。该   init方法初始化类的实例。请注意,你是   将init消息发送到myFraction。也就是说,你想要   在这里初始化一个特定的Fraction对象,所以你不要发送它   类 - 您将它发送到类的实例。确保你   在继续之前了解这一点。

因此,当我向类或类实例发送消息时,alloc和init是创建每个类的实例吗? 我对此很困惑。我在谷歌上搜索但结果却一无所获。我需要你的帮助才能让我清楚明白吗?

我所知道的所有东西都是在内存中分配空间的alloc,所以它实际上并没有被创建一个新实例,只是给我一个地址?

2 个答案:

答案 0 :(得分:1)

首先,你只剩下一些没有任何内存的内存。

当您致电alloc时,部分可用内存将保留供您用于正在创建的实例。完成一些基本设置工作以配置实例所在的类的类型。然后你得到一个指向保留内存位置的指针。

从技术上讲,您可以使用此实例,但是,它可能无法在所有情况下正常工作,因为它尚未初始化。有些类并不真正需要初始化(如NSObject),有些则不需要初始化。通常,在调用某些alloc方法之前,不应使用从init返回的实例。

致电init后,即可使用该实例。

有时,传递给init的参数意味着保留和创建的初始实例不是要使用的正确(类)类型。在这种情况下,它将被销毁,并为您创建一个新的。这在您创建NSArray实例的类集群中非常常见,但在调用init后,您可能会返回NSCFArray。这就是为什么你总是需要使用从init调用返回的实例,即使你已经从alloc返回了实例。

通常您不必担心这一点,但您确实需要遵守规则。

答案 1 :(得分:0)

所以你总是需要allocinit一堂课。

分配意味着你给课程"分数"在这种情况下是一个记忆场所。之后你需要初始化课程" Fraction"所以你可以使用它。

Fraction *class1 = [[Fraction alloc] init];
Fraction *class2 = [[Fraction alloc] init];

[class1 doSomethingWithClass1];
[class2 doSomethingWithClass2];

稍后您将了解单身人士。有了它,你可以一次分配/初始化一个类,并且总是在没有alloc / init的情况下再次使用它。