为什么使用称为 'literals' 的 'literal syntax' 创建实例?

Why are instances created using a 'literal syntax' known as 'literals'?

令我困扰的是为什么术语 'literal' 用于指代 class 的实例,例如 NSStringNSArray。我只看到在引用 NSString 时使用的术语,我天真地认为它与它有关 'literally' 是一个字符串,在引号之间。对不起,如果这听起来很可悲,但我就是这么想的。

然后今天我了解到 NSArray 的某些实例也可以称为文字实例,即使用 'literal syntax'.[=16= 创建的 class 的实例]

文字语法或文字只是使用语言内置的专用语法创建的对象,而不是使用正常的对象创建语法(无论是什么)创建的对象。

这里我创建了一个文字数组:

NSArray* a = @[@"Hello", @"World"];

就所有意图和目的而言,这等同于:

NSArray* a = [NSArray arrayWithObjects:@"Hello", @"World", nil];

第一个被称为文字,因为 @[] 语法内置于创建数组的语言中,与内置 @"..." 语法用于创建 NSString 的方式相同秒。

the term 'literal' is used to refer to instances of classes

它并不是真的指实例;创建对象后,创建方式无关紧要:

NSArray * thisWasCreatedWithALiteral = @[@1, @2];
NSArray * butWhoCares = thisWasCreatedWithALiteral;

"literal"部分只是特殊语法@[@1, @2]

it ha[s] something to do with it 'literally' being a string, that is between quotation markers.

完全正确:这是数组的 写出 表示,而不是使用 arrayWithObjects:

等构造方法创建的数组

正如@Linuxios 指出的那样,文字语法内置于该语言中。不过,它们比您想象的要广泛。文字只是意味着实际值在源代码中编码。所以 ObjC 中有相当多的文字语法。例如:

  • 1 - 整数
  • 1.0 - 双
  • 1.0f - 浮动
  • "a" - C 字符串
  • @"a" - NSString
  • @[] - NSArray
  • ^{} - 函数

是的,块只是函数文字。它们是可分配给符号名称(例如变量或常量)的匿名值。

一般来说,文字可以存储在文本段中,并在编译时计算(而不是在 运行 时)。如果我没记错的话,数组文字目前被扩展为等效代码并在 运行 时间进行评估,但是 @"..." 字符串文字被编码为二进制文件作为静态数据(至少现在是这样;非 Apple我记得 gcc 的版本用于对实际函数调用进行编码以构造静态字符串)。