Ben*_*hen 138 objective-c
我正在学习objective-c并不断碰到@符号.它用于不同的场景,例如在字符串的开头或合成访问器方法.
@符号在objective-c中的含义是什么?
Chr*_*son 155
该@字符未在C或C++标识符中使用,因此它用于以不会与其他语言的关键字冲突的方式引入Objective-C语言关键字.这使得该语言的"目标"部分可以自由地与C或C++部分混合.
因此,除了极少数例外情况,只要您@在某些Objective-C代码中看到,就会看到Objective-C构造而不是C或C++构造.
主要的例外是id,Class,nil,和Nil,它们通常被视为语言的关键字,即使他们可能也有一个typedef或#define甩在身后.例如,编译器实际上确实id根据它应用于声明的指针类型转换规则以及是否生成GC写入障碍的决定来处理.
其他的例外是in,out,inout,oneway,byref,和bycopy; 这些用作方法参数和返回类型的存储类注释,以使分布式对象更有效.(他们变得可从运行时,它DO可以看看方法签名的一部分,以确定如何最佳序列化的交易.)还有中的属性@property声明copy,retain,assign,readonly,readwrite,nonatomic,getter,和setter; 这些只在@property声明的属性部分有效.
the*_*sdj 62
从Objective-C教程:@符号,它是各种关键字的前面的原因:
使用@应该可以更容易地将Objective-C编译器连接到现有的C编译器上.因为@在C语言的任何上下文中都是无效的,除了字符串文字之外,可以修改tokenizer(编译器中的早期和简单步骤)以简单地查找字符串常量之外的@字符(tokenizer理解字符串文字) ,所以它有能力区分这个).当遇到@时,标记生成器会将编译器的其余部分置于"Objective-C模式".(当检测到Objective-C代码结束时,Objective-C解析器将负责将编译器返回到常规C模式).
此外,当在字符串文字的前面看时,它在C中创建一个NSString而不是'char*'.
Van*_*yen 24
来自Macrumors:Objective-C Tutorial,当在字符串文字前面时:
还有@""NSString文字.它基本上是NSString的+ stringWithUTF8String方法的简写.
@还为C字符串添加了unicode支持.
pab*_*ndo 13
从手册:
Objective-C框架通常不使用C风格的字符串.相反,它们将字符串作为NSString对象传递.
NSString类为字符串提供了一个对象包装器,它具有您期望的所有优点,包括用于存储任意长度字符串的内置内存管理,支持Unicode,printf样式的格式化实用程序等.因为这些字符串是常用的,所以Objective-C提供了从常量值创建NSString对象的简写表示法.要使用此简写,您所要做的就是在带有@符号的普通双引号字符串之前,如以下示例所示:
Run Code Online (Sandbox Code Playgroud)NSString *myString = @"My String\n"; NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
正如其他答案所指出的,该@符号可以方便地将 Objective-C 的功能超集添加到 C 中,因为@C 在语法上不使用该符号。
至于它代表什么,这取决于它的使用上下文。这些用途大致分为两类(关键字和文字),我总结了下面可以找到的用途。
我在找到NSHipster 的精彩总结之前写了大部分内容。这是另一个不太彻底的备忘单。(这两个来源都将前缀称为@“编译器指令”,但我认为编译器指令是诸如#define、#ifdef等之类的东西。如果有人可以权衡正确的术语,我将不胜感激。)
@许多 Objective-C 关键字的前缀:
@interface:声明与类关联的方法和属性@implementation:实现类的声明@interface@protocol// @optional:@required声明独立于任何特定类的方法和属性。@class:类的前向声明@property// @synthesize:@dynamic在 an 中声明属性@interface@try/ @throw/ @catch/@finally: 异常处理@end: 关闭@interface、@implementation、 和@protocol。@encode:返回一个对给定类型的内部表示进行编码的 C 字符串@synchronized:确保并行执行独占性@selector/ @protocol:返回SEL具有指定名称的协议指针@defs:我不太确定;它似乎将 Objective-C 类属性导入到struct. NSHipster 的页面说它在现代 Objective-C 中不存在。@public// @package/ @protected:@private访问修饰符@available:检查API 可用性。@autoreleasepool:创建一个新的自动释放范围。autorelease在块中接收到的任何对象都将release在退出块后(而不是之前)接收到。@创建Objective-C 文字:
@...: NSNumber 文字
NSNumber *fortyTwo = @42; // equivalent to [NSNumber numberWithInt:42]
NSNumber *yesNumber = @YES; // equivalent to [NSNumber numberWithBool:YES]
Run Code Online (Sandbox Code Playgroud)
@(...):盒装表达式
// 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)];
Run Code Online (Sandbox Code Playgroud)
@"...":盒装 C 字符串
@[]/ @{}:容器文字
NSArray *array = @[ @"Hello", NSApp, [NSNumber numberWithInt:42] ];
NSDictionary *dictionary = @{
@"name" : NSUserName(),
@"date" : [NSDate date],
@"processInfo" : [NSProcessInfo processInfo]
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49568 次 |
| 最近记录: |