我最近从Programming Objective C,第4版学习objective-c。 阅读部分时我有疑问:
myFraction = [Fraction alloc];
myFraction = [myFraction init];
当您将alloc消息发送到类时,您将返回该类的新实例。保证alloc方法将所有对象的实例变量清零。但是,这并不意味着对象已正确初始化以供使用。您需要在分配对象后对其进行初始化。
同样,你在这里使用的方法是你自己没有写的。该 init方法初始化类的实例。请注意,你是 将init消息发送到myFraction。也就是说,你想要 在这里初始化一个特定的Fraction对象,所以你不要发送它 类 - 您将它发送到类的实例。确保你 在继续之前了解这一点。
因此,当我向类或类实例发送消息时,alloc和init是创建每个类的实例吗? 我对此很困惑。我在谷歌上搜索但结果却一无所获。我需要你的帮助才能让我清楚明白吗?
我所知道的所有东西都是在内存中分配空间的alloc,所以它实际上并没有被创建一个新实例,只是给我一个地址?
答案 0 :(得分:1)
首先,你只剩下一些没有任何内存的内存。
当您致电alloc
时,部分可用内存将保留供您用于正在创建的实例。完成一些基本设置工作以配置实例所在的类的类型。然后你得到一个指向保留内存位置的指针。
从技术上讲,您可以使用此实例,但是,它可能无法在所有情况下正常工作,因为它尚未初始化。有些类并不真正需要初始化(如NSObject
),有些则不需要初始化。通常,在调用某些alloc
方法之前,不应使用从init
返回的实例。
致电init
后,即可使用该实例。
有时,传递给init
的参数意味着保留和创建的初始实例不是要使用的正确(类)类型。在这种情况下,它将被销毁,并为您创建一个新的。这在您创建NSArray
实例的类集群中非常常见,但在调用init
后,您可能会返回NSCFArray
。这就是为什么你总是需要使用从init
调用返回的实例,即使你已经从alloc
返回了实例。
通常您不必担心这一点,但您确实需要遵守规则。
答案 1 :(得分:0)
所以你总是需要alloc
和init
一堂课。
分配意味着你给课程"分数"在这种情况下是一个记忆场所。之后你需要初始化课程" Fraction"所以你可以使用它。
Fraction *class1 = [[Fraction alloc] init];
Fraction *class2 = [[Fraction alloc] init];
[class1 doSomethingWithClass1];
[class2 doSomethingWithClass2];
稍后您将了解单身人士。有了它,你可以一次分配/初始化一个类,并且总是在没有alloc / init的情况下再次使用它。