CALayer和CAAnimation对未实现的属性访问器的动态解析

时间:2011-06-29 05:57:28

标签: ios core-animation

我发现CALayer和CAAnimation不仅扩展了Core Animation Extensions To Key-Value Coding中描述的NSKeyValueCoding协议,还为未实现的属性访问器提供动态解析。例如:

@interface DotLayer : CALayer
@property (nonatomic, retain) id dot;
@end

@implementation DotLayer
@dynamic dot;
@end

只需使用属性声明并声明它是 @dynamic ,我就可以访问 dot 属性而无需实现其访问者:

DotLayer *layer = [DotLayer layer];
NSLog(@"layer responds to dot: %d", [layer respondsToSelector:@selector(dot)]);
layer.dot = nil;
NSLog(@"%@", [layer dot]);

经过进一步调查,我发现这个动态分辨率是由CALayer和CAAnimation的 + resolveInstanceMethod:的特殊实现完成的。

我在WWDC 2010的ImageBrowser示例代码中看到了这种动态分辨率的使用,但我找不到任何说明此功能的文档。所以我想知道:
这个动态分辨率是我可以在我自己的代码中使用的规定行为吗?

1 个答案:

答案 0 :(得分:1)

经过进一步思考,我有自己的猜测: 为了扩展NSKeyValueCoding协议,CALayer和CAAnimation在 + resolveInstanceMethod:的实现中为所有未实现的属性访问器提供动态解析。作为副作用,还包括没有访问器的@dynamic属性。

我不确定WWDC示例代码是有意还是无意地以这种方式编写的。但是,如果我的猜测是正确的,那么它完全依赖于实现,所以我认为我们不应该将它作为一个特征使用。