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

使用@[]和initWithObjects的Objective-C数组分配,objective-c,object,nsarray,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、NS

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

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

提前谢谢你

他们都很好。第一种是更“现代”的字面语法,更受欢迎。是的,它对NSString和NSDictionary的作用是相同的,只是更多的现代文字语法


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

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将是一个包含一个元素的数组,而不是您预期的三个元素,这可能会导致各种难以找到的bug。array2将引发异常,以便您可以修复代码

我确实同意gnasher729

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

基本上,任何对象都被分配

  • 保留对象
  • 增加其使用寿命
  • 增加其访问区域

  • 要了解更多信息,请搜索allocinit方法

    @gnasher829&@Student:如果您有一个类属性,例如
    objectArray
    ,并使用literal@{}方法将其填充到init中--在整个类中进一步使用数组会有任何问题吗?您的声明“
    array1
    将仅在方法中可访问”是不正确的。两个数组的作用相同。因此,@Flowinho,字面语法将创建可以在整个类中使用的数组。为什么只有一个元素而不是两个?有关更多信息,请参阅@Student的注释。使用不需要手动alloc init的字面类型的syntanx还可以做哪些其他类型的对象?另外,从技术上讲,您将这两种类型分为“literal”和“alloc init”?[啃食者,谢谢你]