使用@ []和initWithObjects进行Objective-C数组分配

时间:2014-09-11 10:34:01

标签: objective-c object nsarray

一位工作的同事和我正在努力正确回答两者之间的确切区别 创建数组的两种不同方法:

NSArray *array1 = @[@"this is my first entry",@"this is my second entry"];
NSArray *array2 = [[NSArray alloc] initWithObjects:@"first entry",@"second entry",nil];
  • 任何人都可以解释一下吗?
  • 使用的首选方式是什么?为什么?
  • 另一个有趣的问题是:它对NSString,NSDictionary等类的工作方式是否相同?

提前谢谢!

3 个答案:

答案 0 :(得分:8)

第一种方式是首选。不仅因为它是“现代的”(并不意味着太多),更短,更不容易出错。

initWithObjects存在一个微妙的问题:如果你设法包含一个实际为nil的对象指针,那么initWithObjects将使用它作为尾随的nil指针,而文字语法将引发异常。

NSString* text1 = textField1.text;
NSString* text2 = textField2.text;
NSString* text3 = textField3.text;

NSArray* array1 = [[NSArray alloc] initWithObjects:text1, text2, text3, nil];
NSArray* array2 = @[text1, text2, text3];

如果textField2 == nil,因此text2 = nil,则array1将是一个包含一个元素而不是您期望的三个元素的数组,这可能会导致各种难以找到的错误。 array2将抛出异常,以便您可以修复代码。

答案 1 :(得分:1)

我同意 gnasher729

alloc 分配一块内存来保存对象,并返回指针。 为避免内存泄漏,用户还必须正确释放已分配的对象。因此,首先将首选本地使用任何对象。

基本上正在分配任何对象

  1. 保留对象
  2. 增加其生命时间
  3. 增加其访问区域
  4. 要了解更多信息,请搜索 alloc init 方法。

答案 2 :(得分:0)

他们都很好。第一个是更“现代”的文字语法,更优选。是的,NSString和NSDictionary的工作方式与现代文字语法相同。

http://clang.llvm.org/docs/ObjectiveCLiterals.html