@ 符号在目标 C 中表示什么?

我正在学习目标 C,不断碰到@符号。它在不同的场景中使用,例如在字符串的开头或合成访问器方法。

目标 C 中的@符号是什么意思?

55218 次浏览

目标 -C 教程:@符号来看,它之所以出现在各种关键词的前面:

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

另外,当在字符串文字前面看到它时,它会产生一个 NSString 而不是 C 中的‘ char *’。

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

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

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

其他例外是 inoutinoutonewaybyrefbycopy; 它们用作方法参数和返回类型的存储类注释,以提高分布式对象的效率。(它们成为可从运行时获得的方法签名的一部分,DO 可以通过它来确定如何最好地序列化事务。)在 @property声明中也有属性,copyretainassignout0、 out1、 out2、 out3和 out4; 这些只在 @property声明的属性部分中有效。

麦克谣言: 目标 -C 教程开始,在字符串文字前面:

也有@“”“ NSString 字面值。它本质上是 NSString 的 + stringWithUTF8String 方法的简写。

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

来自 手动操作:

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

NSString 类为具有所有 包括内置内存在内的优点 管理存储任意长度的字符串,支持 Unicode, 类型的格式设置实用程序等等。因为这样的字符串是 但是,Objective-C 提供了一个简写符号 根据常量值创建 NSString 对象, 您所要做的就是在普通的双引号字符串前面加上 @ 符号,如下例所示:

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

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

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

在找到 NShipster 的精彩总结之前,我写了大部分内容。这是另一个不太彻底的 小抄。(这两个源代码都把带有 @前缀的东西称为“编译器指令”,但我认为编译器指令是像 #define#ifdef这样的东西。如果有人能提出正确的术语,我将不胜感激。)

Objective-C 关键词

@前缀多个 Objective-C 关键字:

  • @interface : 声明与类关联的方法和属性
  • @implementation : 实现来自 @interface的类声明
  • @protocol/@optional/@required : 声明独立于任何特定类的方法和属性。
  • 班级前向声明
  • @property/@synthesize/@dynamic : 在 @interface中声明属性
  • @try/@throw/@catch/@finally : 异常处理
  • 关闭 @interface@implementation@protocol
  • @encode: 返回一个 C 字符串,该字符串对给定类型的内部表示进行编码
  • @synchronized: 确保并行执行独占性
  • 返回具有指定名称的 SEL或协议指针
  • 我不太确定; 它似乎将 Objective-C 类属性导入到 struct中。NSHipster 的页面上说现在的 Objective-C 中没有这个软件。
  • @public/@package/@protected/@private: 访问修饰符
  • 检查 API 可用性
  • @autoreleasepool : 创建一个新的自动发布作用域。任何在块中接收到 autorelease的对象将在退出块后(而不是在退出块之前)接收到 release

Objective-C 文字

@创建 目标 C 字面意思:

  • @...: < a href = “ https://clang.llvm.org/docs/ObjectiveCLiterals.html # NSNumber-Literals”rel = “ nofollow noReferrer”> NSNumber Literals

    NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
    NSNumber *yesNumber = @YES;           // equivalent to [NSNumber numberWithBool:YES]
    
  • @(...): < a href = “ https://clang.llvm.org/docs/ObjectiveCLiterals.html # box-expression”rel = “ nofollow noReferrer”> Box 表达式

    // 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)];
    
  • @"...": < a href = “ https://clang.llvm.org/docs/ObjectiveCLiterals.html # box-c-string”rel = “ nofollow noReferrer”> Box C string

  • @[]/@{}: < a href = “ https://clang.llvm.org/docs/ObjectiveCLiterals.html # box-c-string”rel = “ nofollow noReferrer”> Container Literals

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