我正在学习目标 C,不断碰到@符号。它在不同的场景中使用,例如在字符串的开头或合成访问器方法。
目标 C 中的@符号是什么意思?
从 目标 -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 + + 构造。
主要的例外是 id、 Class、 nil和 Nil,它们通常被视为语言关键字,即使它们后面也可能有 typedef或 #define。例如,编译器实际上对 id进行了特殊处理,它将指针类型转换规则应用于声明,以及决定是否生成 GC 写屏障。
id
Class
nil
Nil
typedef
#define
其他例外是 in、 out、 inout、 oneway、 byref和 bycopy; 它们用作方法参数和返回类型的存储类注释,以提高分布式对象的效率。(它们成为可从运行时获得的方法签名的一部分,DO 可以通过它来确定如何最好地序列化事务。)在 @property声明中也有属性,copy、 retain、 assign、 out0、 out1、 out2、 out3和 out4; 这些只在 @property声明的属性部分中有效。
in
out
inout
oneway
byref
bycopy
@property
copy
retain
assign
从 麦克谣言: 目标 -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 样式的字符串, 它们将字符串作为 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这样的东西。如果有人能提出正确的术语,我将不胜感激。)
#ifdef
@前缀多个 Objective-C 关键字:
@interface
@implementation
@protocol
@optional
@required
@synthesize
@dynamic
@try
@throw
@catch
@finally
@encode
@synchronized
SEL
struct
@public
@package
@protected
@private
@autoreleasepool
autorelease
release
@创建 目标 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] };