0
NSArray *array = [dictionary objectForKey:@"field"];

NSArray *array = [[NSArray alloc] initWithArray:[dictionary objectForKey:@"field"]];

我在目标 C 代码中经常看到这两种方法。当我试图理解时,我发现它们都用在类似的情况下,这就产生了矛盾。我不清楚何时应该使用第一种方法以及何时使用第二种方法?任何想法?

欢迎妈妈们详细的解释和有用的参考。

4

2 回答 2

1

首先,这两个例子做的事情略有不同。一种是从现有字典中检索某些内容,另一种是通过从现有字典中检索某些内容来创建一个新数组(该键的值是一个数组)。

但是,如果您要问通过 alloc 获取对象与便捷方法之间的区别。([NSString alloc] init vs [NSString stringWith ...),按照惯例,你拥有任何你称之为 alloc、新副本或 mutableCopy 的东西。任何你称之为不是那些的东西,都是自动发布的。

请参阅此处的内存指南。具体来说,看规则

获得一个自动释放的对象意味着它会在不久的将来某个时候消失。如果您不需要在该函数的范围之外保留,那么您可以对其调用 autorelease 或使用不是 alloc 的便捷方法之一,等等......

例如:

// my object doesn't need that formatted string - create the autoreleased version of it.
- (NSString) description {
    return [NSString stringWithFormat:@"%@ : %d", _title, _id]; 
}

// my object stuffed it away in an iVar - I need the retained version of it.  release in dealloc
- (void) prepare {
    _myVal = [[NSString alloc] initWithFormat:"string I need for %d", _id];
}

在第一个示例中,我创建了一个方便其他人调用的方法,我的类不需要超出该方法范围的对象,因此我创建了它的自动发布版本并返回它。如果调用者需要它超出其调用方法的范围,他可以保留它。如果没有,他可以使用它并让它消失。代码很少。

在第二个示例中,我正在格式化一个字符串并将其分配给一个 iVar 变量,我需要在我的类的生命周期中保留该变量,因此我调用 alloc 来保留它。我拥有它并最终释放它。现在,我可以在这里使用第一个版本,并在其上调用保留。

于 2012-03-23T05:54:53.340 回答
0

您对分配与实例方法有根本的误解。

第一个示例,NSDictionary 的 -objectForKey 方法,返回 id,而不是 NSDictionary 的实例,因此它不分配或初始化变量。

然而,第二个是保留-释放周期的经典保留部分。

这两种方法基本上是相等的(如果我们假设数组是分配的,但第一个是空的,第二个是 nil),并且都获得数组对象的所有权。我会选择第二个,因为它保证了参考,而且更短。

我认为您对此感到困惑的是新的便捷方法。方便的方法(如 NSNumber 的 +numberWithInt:、NSString 的 +stringWithFormat: 和 NSMutableArray 的 +array),返回类的自动释放实例(通常)。new 用一个词代替了 alloc 和 init。

于 2012-03-23T06:00:42.847 回答