确实 - [CALayer drawInContext:]做点什么?

时间:2012-01-11 01:50:49

标签: objective-c ios callstack swizzling

According to documentation  默认实现什么都不做。

但是......我从drawRect方法抛出异常,我看到下一个callstack

3   EasyWakeup                          0x0003a7b6 -[AlarmIntervalView drawRect:] + 71
4   UIKit                               0x003f6187 -[UIView(CALayerDelegate) drawLayer:inContext:] + 426
5   QuartzCore                          0x011a8b5e -[CALayer drawInContext:] + 143

因此我可以理解它意味着 - [CALayer drawInContext:]调用的默认实现 委托方法。 这是对的吗? 既然我已经知道了混合技术,我对目标c不确定...

1 个答案:

答案 0 :(得分:4)

你是正确的,因为CALayer的默认drawInContext:什么都不做。除非图层具有委托,否则该图层的委托实现drawLayer:inContext:,这是正确的。所以文档的问题是它应该在语句“默认实现什么都不做”旁边有一个小星号。

请记住,所有视图都支持某种CALayer。此图层将自动设置为将其视图设置为其委托。表面上不明显的是UIView确实实现了CALayer的委托drawLayer:inContext:。这就是你在调用堆栈上调用所有这些调用的内容。

您的AlarmIntervalView实例自动拥有一个支持层,该支持层的代理设置为AlarmIntervalView实例。系统的某些部分调用后备层的drawInContext:来检查委托(它有),发送代理respondsToSelector:drawLayer:inContext:作为参数(UIView确实响应),最后实际发送消息drawLayer:inContext:。 UIView的drawLayer:inContext:实现会调用您的视图drawRect:

我不确定你为什么提到调酒。

[我的回答很长,主要是为了我的利益。它也有助于我学习。]