题
我正在学习 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 语言中的任何上下文中都无效,因此可以修改分词器(编译器中的早期且简单的步骤)以简单地在字符串常量之外查找 @ 字符(分词器理解字符串文字) ,因此可以区分这一点)。当 @遇到 @时,令牌器将使其余的编译器处于“ Objective-C模式”。 (Objective-C解析器将负责将编译器检测到Objective-C代码的末尾时,将编译器返回常规C模式)。
此外,当在字符串文字前面看到时,它会生成 NSString 而不是 C 中的“char *”。
从 宏观消息:Objective-C 教程, ,当位于字符串文字前面时:
还有 @"" 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"];