初始化NSArray的不同方式

时间:2014-09-05 08:26:22

标签: ios objective-c

我习惯于初始化NSArray的简单方法。

NSArray *temp = [[NSArray alloc] initWithObjects:@"data1",@"data2",@"data3",nil];

我现在遇到了一个非弧形应用程序中的代码,其中初始化在许多地方完成,如

NSArray *temp;
temp = [@[@"data1",@"data2",@"data3"] retain];

任何人都可以详细说明两者之间的差异,如果一个人比其他人好。

谢谢

3 个答案:

答案 0 :(得分:2)

第二种是使用新的(ish)Objective-C Literal syntax

此文字语法允许简化NSNumberNSArrayNSDictionary对象的创建,以及为数组和字典提供下标支持。

答案 1 :(得分:2)

第二个只是一个捷径:

+ (instancetype)arrayWithObjects:(id)firstObj,...

@[@"data1",@"data2",@"data3"];

将编译为:

[NSArray arrayWithObjects:@"data1",@"data2",@"data3",nil];

你不能说一个比另一个更好,它们是为不同的目的而制造的。发明了快捷语法来创建内容更快的数组。您可以看到快捷方式的代码少于完整的arrayWithObjects示例。

还有其他快捷方式:

@{key: object}

创建NSDictionary

@YES @NO @value /* like @35 */ @(x + y)

创建NSNumber

答案 2 :(得分:0)

第一个语句实例化NSArray个对象。在实践中,您很少看到此代码,因为NSArray对象是不可变的,并且拥有一个没有您无法更改的元素的数组对象是没用的。

更常见
NSMutableArray *temp = [[NSMutableArray alloc] init];

或类似的东西,然后再将对象添加到数组中。

第二种情况声明了一个NSArray类型的新变量,并将其分配给三个NSStrings的数组,然后保留此NSArray个对象。这个新数组是不可变的,就像之前一样,因此无法更改。通过发送保留消息,该对象的保留计数将递增,并且在发送release之前不会释放该对象。如果没有retain,则该对象由其他东西拥有,可能是自动释放池,在这种情况下,当方法返回时,它将被释放。