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



我最近从Programming Objective C, 4th edition学习了Objective - C。我在阅读部分时有疑问:

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

当你发送alloc消息给一个类时,你会得到这个类的一个新实例。alloc方法保证将对象的所有实例变量归零。但是,这并不意味着对象已经被正确初始化以供使用。你需要在分配对象之后初始化它。

再次说明,您在这里使用的方法不是您自己编写的。的Init方法初始化类的实例。请注意将init消息发送给myFraction。也就是说,你想要在这里初始化一个特定的Fraction对象,这样你就不会把它发送到类——您将它发送给类的实例。确保你在继续之前先理解这一点。

所以alloc和init是创建类的每个实例当我发送消息给类或类的实例?我很困惑。我在谷歌上搜索,但结果什么也没找到。我需要你的帮助,让我明白这一点。

我所知道的就是alloc在内存中分配空间所以它实际上不是创建一个新实例,只是给我地址?

一开始你只有一些可用的内存,里面什么都没有。

当您调用alloc时,其中一些空闲内存将保留给您正在创建的实例使用。完成了一些基本的设置工作来配置实例所属的类的类型。然后你会得到一个指向预留内存位置的指针。

从技术上讲,你可以使用这个实例,但是,它可能不是在所有情况下都能正常工作,因为它没有被初始化。有些类不需要初始化(比如NSObject),有些则需要。一般来说,在调用init方法之前,永远不要使用alloc返回的实例。

调用init之后,实例就可以使用了。

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

通常你不需要担心这个,但你确实需要遵守规则。

所以你总是需要allocinit一个类。

在这种情况下,

分配意味着你给类"Fraction"一个内存位置。之后,您需要初始化类"Fraction",以便可以使用它。

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

稍后您将了解单例。有了它,你可以一次alloc/init一个类,并且总是在不再次alloc/init的情况下使用它。

最新更新