我正在学习objective-c并不断碰到@符号。它用于不同的场景,例如在字符串的开头或合成访问器方法。
在objective-c中@符号是什么意思?
该@
字符不用于 C 或 C++ 标识符中,因此它用于以不会与其他语言的关键字冲突的方式引入 Objective-C 语言关键字。这使得语言的“目标”部分可以与 C 或 C++ 部分自由混合。
因此,除了极少数例外,任何时候您@
在某些 Objective-C 代码中看到的都是 Objective-C 构造而不是 C 或 C++ 构造。
主要的例外是id
、Class
、nil
和Nil
,它们通常被视为语言关键字,即使它们后面也可能有 atypedef
或。#define
例如,编译器实际上确实id
在其应用于声明的指针类型转换规则以及是否生成 GC 写屏障的决定方面进行了特殊处理。
其他例外是in
, out
, inout
, oneway
, byref
, 和bycopy
; 这些用作方法参数和返回类型的存储类注释,以使分布式对象更高效。@property
(它们成为运行时可用的方法签名的一部分,DO 可以查看它以确定如何最好地序列化事务。)声明中还有属性, copy
, retain
, assign
, readonly
, readwrite
, nonatomic
,getter
和setter
; 这些仅在@property
声明的属性部分内有效。
来自Objective-C 教程:@ Symbol,它位于各种关键字前面的原因:
使用 @ 应该更容易将 Objective-C 编译器连接到现有的 C 编译器。因为 @ 在 C 中除了字符串文字之外的任何上下文中都无效,因此可以修改标记器(编译器中的一个早期且简单的步骤)以简单地在字符串常量之外查找 @ 字符(标记器理解字符串文字,所以它可以区分这一点)。当遇到 @ 时,标记器会将编译器的其余部分置于“Objective-C 模式”。(Objective-C 解析器将负责在检测到 Objective-C 代码结束时将编译器返回到常规 C 模式)。
同样,当在字符串文字前面看到时,它会生成 NSString 而不是 C 中的 '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"];