@ 符号在 objective-c 中代表什么?

What does the @ symbol represent in objective-c?

提问人:Benedict Cohen 提问时间:8/25/2008 最后编辑:The Archetypal PaulBenedict Cohen 更新时间:7/24/2022 访问量:56507

问:

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

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

目标-C

评论

0赞 Kumar 7/22/2015
为什么在@interface和@end之前使用 @?

答:

70赞 thelsdj 8/25/2008 #1

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

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

此外,当在字符串文字前面看到时,它会在 C 中生成 NSString 而不是“char *”。

163赞 Chris Hanson 8/25/2008 #2

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

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

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

其他例外情况包括 、 、 、 、 和 ;它们用作方法参数和返回类型的存储类注释,以提高分布式对象的效率。(它们成为运行时中可用的方法签名的一部分,DO 可以查看这些签名以确定如何最好地序列化事务。声明中还有属性,、、、、、和;这些仅在声明的属性部分内有效。inoutinoutonewaybyrefbycopy@propertycopyretainassignreadonlyreadwritenonatomicgettersetter@property

评论

5赞 addlistener 7/28/2014
你能解释一下@(expression)是做什么的吗?这是我在 xcode 中键入 @ 时显示的弹出窗口中唯一不理解的项目。
14赞 JoJo 9/30/2015
@(99) 与 [NSNumber numberWithInteger:99] 相同。@(YES) 与 [NSNumber numberWithBool:YES] 相同。@ 符号是创建对象的快捷方式。
13赞 Jon McClung 8/23/2018
有没有人对这个“答案”并没有真正回答所述问题这一事实感到困惑?提问者说“'@'在Objective-C中是什么意思?”回答者说“这意味着你正在使用Objective-C”。我想他已经知道了......
1赞 Chris Hanson 4/9/2019
有点武断;它需要位于基本 ASCII 集中,并且在编写第一个 Objective-C 预处理器时尚未被 C 使用。这就是为什么它是.@
1赞 Chris Hanson 4/9/2019
Jon McClung:Leo是对的,没有“更深层次的意义”。该字符未被 C 使用,因此它是替代解析的方便“逃生舱口”,还保留了与现有 C 代码的 100% 兼容性。@
28赞 Van Nguyen 1/11/2009 #3

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

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

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

评论

15赞 11/1/2011
“它本质上是 NSString 的 +stringWithUTF8String 方法的简写。”嗯,不完全是。字符串是静态分配的,这使得它们不同于(动态分配的字符串),并且释放和保留对它们没有影响。+[NSString stringWithUTF8String:]
20赞 pabloelustondo 2/2/2012 #4

手册

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

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

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

评论

4赞 GreenAsJade 1/3/2017
但这只是使用地点的一个例子。我正在查看这样的代码:...与 NSString 无关@mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),
5赞 Carl G 7/24/2022 #5

正如其他答案所指出的,该符号便于将 Objective-C 的功能超集添加到 C 中,因为 C 在语法上没有使用。@@

至于它代表什么,这取决于使用它的上下文。这些用法大致分为两类(关键字和文字),我在下面总结了我能找到的用法。

在找到NSHipster的精彩摘要之前,我写了大部分内容。这是另一个不太彻底的备忘单。(这两个来源都称事物为前缀为“编译器指令”,但我认为编译器指令是 、 等。如果有人能权衡正确的术语,我将不胜感激。@#define#ifdef

Objective-C 关键字

@为许多 Objective-C 关键字添加前缀:

  • @interface:声明与类关联的方法和属性
  • @implementation:实现类的声明@interface
  • @protocol/@optional/@required:声明独立于任何特定类的方法和属性。
  • @class:类的正向声明
  • @property/@synthesize/@dynamic:在@interface
  • @try/@throw/@catch/@finally:异常处理
  • @end:关闭 、 和 。@interface@implementation@protocol
  • @encode:返回一个 C 字符串,该字符串对给定类型的内部表示形式进行编码
  • @synchronized:确保并行执行的独占性
  • @selector/@protocol:具有指定名称的返回指针或协议指针SEL
  • @defs: 我不太确定;它似乎将 Objective-C 类属性导入到 .NSHipster的页面说它在现代Objective-C中不存在。struct
  • @public/@package/@protected/@private:访问修饰符
  • @available:检查 API 可用性
  • @autoreleasepool:创建新的自动释放范围。在块中收到 an 的任何对象都将在退出块后(而不是之前)收到 a。autoreleaserelease

Objective-C 文字

@创建 Objective-C 文字

  • @...NSNumber 文字

    NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
    NSNumber *yesNumber = @YES;           // equivalent to [NSNumber numberWithBool:YES]
    
  • @(...)盒装表达式

    // numbers.
    NSNumber *piOverTwo = @(M_PI / 2);        // [NSNumber numberWithDouble:(M_PI / 2)]
    // strings.
    NSString *path = @(getenv("PATH"));       // [NSString stringWithUTF8String:(getenv("PATH"))]
    // structs.
    NSValue *center = @(view.center);         // Point p = view.center;
                                              // [NSValue valueWithBytes:&p objCType:@encode(Point)];
    
  • @"..."盒装 C 字符串

  • @[]/@{}容器文字

    NSArray *array = @[ @"Hello", NSApp, [NSNumber numberWithInt:42] ];
    NSDictionary *dictionary = @{
      @"name" : NSUserName(),
      @"date" : [NSDate date],
      @"processInfo" : [NSProcessInfo processInfo]
    };