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

Flo*_*nho 3 object objective-c nsarray

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

NSArray *array1 = @[@"this is my first entry",@"this is my second entry"];
NSArray *array2 = [[NSArray alloc] initWithObjects:@"first entry",@"second entry",nil];
Run Code Online (Sandbox Code Playgroud)
  • 有谁能解释一下?
  • 使用的首选方式是什么?为什么?
  • 另一个有趣的问题是:NSString,NSDictionary等类的工作方式是否相同?

先感谢您!

gna*_*729 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];
Run Code Online (Sandbox Code Playgroud)

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