我发现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示例代码中看到了这种动态分辨率的使用,但我找不到任何说明此功能的文档。所以我想知道:
这个动态分辨率是我可以在我自己的代码中使用的规定行为吗?
答案 0 :(得分:1)
经过进一步思考,我有自己的猜测: 为了扩展NSKeyValueCoding协议,CALayer和CAAnimation在 + resolveInstanceMethod:的实现中为所有未实现的属性访问器提供动态解析。作为副作用,还包括没有访问器的@dynamic属性。
我不确定WWDC示例代码是有意还是无意地以这种方式编写的。但是,如果我的猜测是正确的,那么它完全依赖于实现,所以我认为我们不应该将它作为一个特征使用。