为什么使用称为“文字”的“文字语法”创建实例?

时间:2015-02-04 19:56:10

标签: objective-c terminology literals objective-c-literals

困扰我的是为什么术语“字面上的”字样。用于引用类NSStringNSArray等类的实例。我只看到了NSString中使用的术语,并且天真地我认为它与它有关&字面上'是一个字符串,在引号之间。对不起,如果这听起来很可悲,但这就是我一直在想的。

然后今天我了解到NSArray的某些实例也可以称为文字实例,即使用'文字语法创建的类的实例。

3 个答案:

答案 0 :(得分:2)

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

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

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

对于与此相当的所有意图和目的:

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

第一个称为文字,因为@[]语法内置于用于创建数组的语言中,就像内置@"..."语法来创建NSString一样。

答案 1 :(得分:2)

正如@Linuxios所说,文字语法内置于该语言中。不过,它们比你想象的还要广泛。文字只意味着在源中编码实际值。所以ObjC中有很多文字语法。例如:

  • 1 - int
  • 1.0 - 双
  • 1.0f - float
  • "a" - C-string
  • @"a" - NSString
  • @[] - NSArray
  • ^{} - 功能

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

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

答案 2 :(得分:1)

  

术语'字面'用于引用类的实例

它并没有真正提到实例;在创建对象之后,创建它的方式并不重要:

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

"字面" part只是特殊语法@[@1, @2]

  

它与它有关'字面意思'是一个字符串,在引号之间。

完全正确:这是数组的写出表示形式,而不是像arrayWithObjects:

这样的构造方法创建的表示形式