代码之家  ›  专栏  ›  技术社区  ›  Eddie

目标C:拳击VS文字

  •  0
  • Eddie  · 技术社区  · 9 年前

    我应该使用哪种构造,为什么?我将以 NSArray 。这同样适用于其他“盒装”对象,例如 NSDictionary , NSNumber ...

    NSArray *arr1 = @[object1, object2, object3];
    

    NSArray *arr2 = [NSArray arrayWithObjects:object1, object2, object3, nil];
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   Sergey Kalinichenko    9 年前

    这两种构造对 NSArray NSDictionary 物体。不同之处在于,第一种语法在2012版本的编译器之前不可用,而 arrayWithObjects: 适用于所有版本的语言。

    如果您不打算使用旧版本的编译器编译代码,那么新语法将为您提供更好的可读性,尤其是对于 NSNumber 物体。比较

    NSArray *arr = @[@1, @2, @3];
    

    与。

    NSArray *arr = [NSArray arrayWithObjects:
        [NSNumber numberWithInteger:1]
    ,   [NSNumber numberWithInteger:2]
    ,   [NSNumber numberWithInteger:3]
    ,   nil
    ];
    
        2
  •  1
  •   Ken Thomases    9 年前

    也不 NSArray 也没有 NSDictionary 文字被“装箱”。装箱是指用标量或非对象类型制作对象。Cocoa数组和字典始终是对象。

    拳击 的相关术语 NSNumber 虽然例如 1 是一个 int ,标量类型(不是对象)。 @1 是一个 数字对象 ,拳击的结果 1. 不过,从技术上讲,我想说 [NSNumber numberWithInt:1] 也是拳击。就是这样 @1 是更方便的语法。

    以下两者之间存在差异:

    NSArray *arr1 = @[object1, object2, object3];
    

    NSArray *arr2 = [NSArray arrayWithObjects:object1, object2, object3, nil];
    

    在第一个(如果有) object1 , object2 object3 持有 nil ,您将得到一个运行时异常。在第二个,任何 只是终止参数列表。所以,如果 对象2 , arr2 最终将作为一个单独的元素数组 对象1 . 不可变数组 根本不会考虑 对象3 因为,就它而言,参数列表在第一个元素之后终止。

    很少情况下,您可以合法地使用这种行为(在这种情况下,我会在评论中明确指出),但大多数情况下,这是意外和不可取的行为。这是一种特别有害的虫子。