我正在学习objective-c并不断碰到@符号.它用于不同的场景,例如在字符串的开头或合成访问器方法.
@符号在objective-c中的含义是什么?
该@
字符未在C或C++标识符中使用,因此它用于以不会与其他语言的关键字冲突的方式引入Objective-C语言关键字.这使得该语言的"目标"部分可以自由地与C或C++部分混合.
因此,除了极少数例外情况,只要您@
在某些Objective-C代码中看到,就会看到Objective-C构造而不是C或C++构造.
主要的例外是id
,Class
,nil
,和Nil
,它们通常被视为语言的关键字,即使他们可能也有一个typedef
或#define
甩在身后.例如,编译器实际上确实id
根据它应用于声明的指针类型转换规则以及是否生成GC写入障碍的决定来处理.
其他的例外是in
,out
,inout
,oneway
,byref
,和bycopy
; 这些用作方法参数和返回类型的存储类注释,以使分布式对象更有效.(他们变得可从运行时,它DO可以看看方法签名的一部分,以确定如何最佳序列化的交易.)还有中的属性@property
声明copy
,retain
,assign
,readonly
,readwrite
,nonatomic
,getter
,和setter
; 这些只在@property
声明的属性部分有效.
从Objective-C教程:@符号,它是各种关键字的前面的原因:
使用@应该可以更容易地将Objective-C编译器连接到现有的C编译器上.因为@在C语言的任何上下文中都是无效的,除了字符串文字之外,可以修改tokenizer(编译器中的早期和简单步骤)以简单地查找字符串常量之外的@字符(tokenizer理解字符串文字) ,所以它有能力区分这个).当遇到@时,标记生成器会将编译器的其余部分置于"Objective-C模式".(当检测到Objective-C代码结束时,Objective-C解析器将负责将编译器返回到常规C模式).
此外,当在字符串文字的前面看时,它在C中创建一个NSString而不是'char*'.
来自Macrumors:Objective-C Tutorial,当在字符串文字前面时:
还有@""NSString文字.它基本上是NSString的+ stringWithUTF8String方法的简写.
@还为C字符串添加了unicode支持.
从手册:
Objective-C框架通常不使用C风格的字符串.相反,它们将字符串作为NSString对象传递.
NSString类为字符串提供了一个对象包装器,它具有您期望的所有优点,包括用于存储任意长度字符串的内置内存管理,支持Unicode,printf样式的格式化实用程序等.因为这些字符串是常用的,所以Objective-C提供了从常量值创建NSString对象的简写表示法.要使用此简写,您所要做的就是在带有@符号的普通双引号字符串之前,如以下示例所示:
NSString *myString = @"My String\n"; NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];