152

我正在学习objective-c并不断碰到@符号。它用于不同的场景,例如在字符串的开头或合成访问器方法。

在objective-c中@符号是什么意思?

4

4 回答 4

161

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

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

主要的例外是idClassnilNil,它们通常被视为语言关键字,即使它们后面也可能有 atypedef或。#define例如,编译器实际上确实id在其应用于声明的指针类型转换规则以及是否生成 GC 写屏障的决定方面进行了特殊处理。

其他例外是in​​ , out, inout, oneway, byref, 和bycopy; 这些用作方法参数和返回类型的存储类注释,以使分布式对象更高效。@property(它们成为运行时可用的方法签名的一部分,DO 可以查看它以确定如何最好地序列化事务。)声明中还有属性, copy, retain, assign, readonly, readwrite, nonatomic,gettersetter; 这些仅在@property声明的属性部分内有效。

于 2008-08-25T08:36:29.887 回答
68

来自Objective-C 教程:@ Symbol,它位于各种关键字前面的原因:

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

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

于 2008-08-25T08:04:44.843 回答
27

来自Macrumors: Objective-C Tutorial,当在字符串文字前面时:

还有 @"" NSString 文字。它本质上是 NSString 的 +stringWithUTF8String 方法的简写。

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

于 2009-01-11T15:27:28.670 回答
18

手册

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

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

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
于 2012-02-02T05:51:32.593 回答