嘿伙计我只是有一个简单的目标c问题,我一直在查看我公司的代码库,我偶然发现了一些有趣的东西。什么时候应该使用[[alloc] init]什么时候不应该使用[[alloc] init]。这是一个典型的例子:
案例1:
NSString *url = nil;
url = @"hi";
案例2:
NSString *url = [[NSString alloc] init];
url = @"hi";
那么什么时候应该使用案例1?何时应该使用案例2?我希望有人可以一劳永逸地为我解决这个问题,在我的应用程序开发过程中,我一直在使用Case 2,因为我认为它等同于在C ++中调用“new”(基本上是调用对象构造函数)。我感到震惊的是,案例1甚至可以工作,因为案例1表明没有对该对象进行构造函数或内存分配的调用。案例1在我看到的代码库中无处不在。
答案 0 :(得分:2)
alloc
创建存储并执行一些基本的自动设置,返回类的实例。 init
允许实例根据该类所需的逻辑来配置自身。 =
为指针分配不同的实例。
所以第一个总是正确的,第二个总是不正确的。没有必要创建一个对象的实例,然后将它扔掉一行。
(除了:使用ARC,您可以随时跳过= nil
隐含的内容;在您的情况下,您可以跳过它,无论是否因为以下任务而分配)
答案 1 :(得分:2)
@"喜"创建NSString的实例。它进行分配和初始化。因此,在第2种情况下,你毫无意义地分配内存,然后重新分配" url"指向新内存的指针。
你必须记住" url"是一个指针。就像在C或C ++中一样,当你使用" ="如果操作员正在重新分配指向的位置,则不会影响它过去指向的内存。在C中,如果要更改存储在新分配的内存中的值,则必须使用取消引用运算符。
答案 2 :(得分:1)
alloc
创建一个对象。因此,当您想要创建类的实例时,可以使用它。在这种情况下,您不想创建对象,因为您将分配现有对象@" hi"到变量。因此,您永远不会编写案例2,因为它会创建一个对象并立即将其丢弃为另一个对象。