objective-c-reserved-words.md 3.2 KB

Objective-C保留字


Steffen Itterheim 在他的博客中总结了 Objective-C 2.0 所有的编译器保留字,并且对这些保留字做了介绍和使用示例。这些保留字如下:

@class
@defs
@protocol @required @optional @end
@interface @public @package @protected @private @property @end
@implementation @synthesize @dynamic @end
@throw @try @catch @finally
@synchronized @autoreleasepool
@selector @encode
@compatibility_alias
@”string”

其中比较少用到的包括 @dynamic @defs @encode @compatibility_alis,所以主要介绍这几个关键字。

@dynamic {#dynamic}

@dynamic 是相对于 @synthesize 的,它们用样用于修饰 @property,用于生成对应的的 getter 和 setter 方法。但是 @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。

示例如下:

@implementation ClassName
@synthesize aProperty, bProperty;
@synthesize cProperty=instanceVariableName;
@dynamic anotherProperty;
// method implementations
@end

@defs

@defs用于返回一个 Objective-C 类的 struct 结构,这个 struct 与原 Objective-C 类具有相同的内存布局。就象你所知的那样,Objective-C 类可以理解成由基本的 C struct 加上额外的方法构成。

示例代码如下:

struct { @defs( NSObject) }

你可能会想,什么情况下才会需要使用这个关键字。答案是涉及非常底层的操作或优化的时候才会用到。像如这篇讨论Objective-C 如何做缓存优化的文章中,就用到了该关键字。

@encode {#encode}

@encode 是用于表示一个类型的字符串,对此,苹果有专门的介绍文档

示例如下:

-(void) aMethod
{
    char *enc1 = @encode(int);                 // enc1 = "i"
    char *enc2 = @encode(id);                  // enc2 = "@"
    char *enc3 = @encode(@selector(aMethod));  // enc3 = ":"
    // practical example:
    CGRect rect = CGRectMake(0, 0, 100, 100);
    NSValue *v = [NSValue value:&rect withObjCType:@encode(CGRect)];
}

@compatibility_alis {#compatibility-alis}

@compatibility_alis 是用于给一个类设置一个别名。这样就不用重构以前的类文件就可以用新的名字来替代原有名字。

示例如下:

@compatibility_alias AliasClassName ExistingClassName

@autoreleasepool {#autoreleasepool}

@autoreleasepool 是用于 ARC 下代替 NSAutoreleasePool 的保留字,在苹果的这篇官方文档中有提到, @autoreleasepoolNSAutoreleasePool 快 6 倍。当然,文档中也提到,ARC 下不止 Autorelease Pool 的实现变快了,retainrelease 也快很多。如果你还没有在工程中使用 ARC,推荐看看《是否应该使用 ARC》