@符号在Objective-C中代表什么?


Answers:


159

@字符未在C或C ++标识符中使用,因此用于引入Objective-C语言关键字,而不会与其他语言的关键字发生冲突。这使语言的“目标”部分可以自由地与C或C ++部分混合。

因此,除了极少数例外,任何时候@在某些Objective-C代码中看到的都是在看Objective-C构造而不是C或C ++构造。

主要的例外是idClassnil,和Nil,它们通常被视为语言的关键字,即使他们可能也有一个typedef#define甩在身后。例如,编译器实际上确实会id根据其应用于声明的指针类型转换规则以及是否生成GC写障碍的决定来特别对待。

其他的例外是inoutinoutonewaybyref,和bycopy; 这些用作方法参数和返回类型的存储类批注,以使分布式对象更有效。(他们变得可从运行时,它DO可以看一下,以确定如何最好地序列化交易的方法签名的一部分。)还有中的属性@property声明copyretainassignreadonlyreadwritenonatomicgetter,和setter; 这些仅在@property声明的属性部分内有效。


4
您能解释一下@(expression)的功能吗?当我在xcode中键入@时,这是我在弹出式窗口中看不懂的唯一项目。
jchnxu 2014年

10
@(99)与[NSNumber numberWithInteger:99]相同。@(YES)与[NSNumber numberWithBool:YES]相同。@符号是创建对象的快捷方式。
JoJo 2015年

7
其他人是否对这个“答案”没有真正回答所陈述的问题感到困惑?询问者说:“ @-在Objective-C中是什么意思?” 回答者说:“这意味着您正在使用Objective-C。” 我认为他已经知道很多……
乔恩·麦格隆

1
有点随意 当编写第一个Objective-C预处理程序时,它必须位于基本ASCII集中,并且尚未被C使用。这就是为什么@
克里斯·汉森

1
乔恩·麦克伦(Jon McClung):狮子座是对的,没有“更深层的含义”。该@字符未由C使用,因此它是替代解析的便捷“转义线”,该解析还保留了与现有C代码100%的兼容性。
克里斯·汉森

63

来自Objective-C教程:@ Symbol,其原因在于各个关键字的前面:

使用@应该可以更轻松地将Objective-C编译器连接到现有的C编译器。因为@在字符串中除了字符串文字在C中的任何上下文中都是无效的,所以可以修改令牌化程序(编译器中的一个简单的早期步骤),以简单地在字符串常量之外查找@字符(令牌化程序可以理解字符串文字) ,因此可以区分)。遇到@时,令牌化程序会将编译器的其余部分置于“ Objective-C模式”。(Objective-C解析器将负责在检测到Objective-C代码结束时将编译器返回到常规C模式)。

同样,当在字符串文字的前面看到它时,它在C中生成NSString而不是'char *'。


24

来自Macrumors:Objective-C教程,位于字符串文字前面:

还有@“” NSString文字。它实质上是NSString的+ stringWithUTF8String方法的简写。

@还为C字符串添加了unicode支持。


12
“它实质上是NSString的+ stringWithUTF8String方法的简写。” 好吧,不完全是。字符串是静态分配的,这使它们不同于+[NSString stringWithUTF8String:](动态分配的)字符串,并且释放和保留对它们没有影响。

16

手册

Objective-C框架通常不使用C样式的字符串。相反,它们将字符串作为NSString对象传递。

NSString类为字符串提供对象包装,它具有您所期望的所有优点,包括用于存储任意长度字符串的内置内存管理,对Unicode的支持,printf样式的格式化实用程序等。由于此类字符串是常用的,因此Objective-C提供了一种从常量值创建NSString对象的简写符号。要使用此速记,您需要做的是在普通的双引号字符串前加上@符号,如以下示例所示:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];

3
但这只是在何处@使用的一个示例。我正在看这样的代码:mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),...与NSString无关
GreenAsJade
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.