提问人:Benedict Cohen 提问时间:8/25/2008 最后编辑:The Archetypal PaulBenedict Cohen 更新时间:7/24/2022 访问量:56507
@ 符号在 objective-c 中代表什么?
What does the @ symbol represent in objective-c?
答:
摘自 Objective-C 教程:@ Symbol,它位于各种关键字前面的原因:
使用 @ 应该可以更轻松地将 Objective-C 编译器固定到现有的 C 编译器上。由于 @ 在 C 中除字符串文字之外的任何上下文中都无效,因此可以修改分词器(编译器中的早期简单步骤)以简单地在字符串常量之外查找 @ 字符(分词器理解字符串文字,因此可以区分这一点)。当遇到 @ 时,分词器会将编译器的其余部分置于“Objective-C 模式”。(当 Objective-C 解析器检测到 Objective-C 代码的末尾时,它将负责将编译器返回到常规 C 模式)。
此外,当在字符串文字前面看到时,它会在 C 中生成 NSString 而不是“char *”。
该字符不用于 C 或 C++ 标识符中,因此它用于以不会与其他语言的关键字冲突的方式引入 Objective-C 语言关键字。这使得语言的“目标”部分能够与C或C++部分自由混合。@
因此,除了极少数例外,任何时候你看到一些Objective-C代码,你看到的都是Objective-C结构,而不是C或C++结构。@
主要的例外是 、 、 和 ,它们通常被视为语言关键字,即使它们后面也可能有 或。例如,编译器实际上在应用于声明的指针类型转换规则以及是否生成 GC 写入屏障的决定方面进行了特殊处理。id
Class
nil
Nil
typedef
#define
id
其他例外情况包括 、 、 、 、 和 ;它们用作方法参数和返回类型的存储类注释,以提高分布式对象的效率。(它们成为运行时中可用的方法签名的一部分,DO 可以查看这些签名以确定如何最好地序列化事务。声明中还有属性,、、、、、和;这些仅在声明的属性部分内有效。in
out
inout
oneway
byref
bycopy
@property
copy
retain
assign
readonly
readwrite
nonatomic
getter
setter
@property
评论
@
@
来自 Macrumors: Objective-C Tutorial,当在字符串文字前面时:
还有 @“” NSString 文字。它本质上是 NSString 的 +stringWithUTF8String 方法的简写。
@ 还添加了对 C 字符串的 unicode 支持。
评论
+[NSString stringWithUTF8String:]
从手册:
Objective-C 框架通常不使用 C 样式的字符串。相反 它们将字符串作为 NSString 对象传递。
NSString 类为具有所有 您期望的优势,包括内置内存 用于存储任意长度字符串的管理,支持 Unicode、 printf 样式的格式化实用程序等。因为这样的字符串是 虽然通常使用,但 Objective-C 提供了 从常量值创建 NSString 对象。要使用此速记, 您所要做的就是在普通的双引号字符串前面加上 @ 符号,如以下示例所示:
NSString *myString = @"My String\n"; NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
评论
@
mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),
正如其他答案所指出的,该符号便于将 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。autorelease
release
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] };
评论