首先,这两个例子做的事情略有不同。一种是从现有字典中检索某些内容,另一种是通过从现有字典中检索某些内容来创建一个新数组(该键的值是一个数组)。
但是,如果您要问通过 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 来保留它。我拥有它并最终释放它。现在,我可以在这里使用第一个版本,并在其上调用保留。