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不确定...
答案 0 :(得分:4)
你是正确的,因为CALayer的默认drawInContext:
什么都不做。除非图层具有委托和,否则该图层的委托实现drawLayer:inContext:
,这是正确的。所以文档的问题是它应该在语句“默认实现什么都不做”旁边有一个小星号。
请记住,所有视图都支持某种CALayer。此图层将自动设置为将其视图设置为其委托。表面上不明显的是UIView确实实现了CALayer的委托drawLayer:inContext:
。这就是你在调用堆栈上调用所有这些调用的内容。
您的AlarmIntervalView实例自动拥有一个支持层,该支持层的代理设置为AlarmIntervalView实例。系统的某些部分调用后备层的drawInContext:
来检查委托(它有),发送代理respondsToSelector:
,drawLayer:inContext:
作为参数(UIView确实响应),最后实际发送消息drawLayer:inContext:
。 UIView的drawLayer:inContext:
实现会调用您的视图drawRect:
。
我不确定你为什么提到调酒。
[我的回答很长,主要是为了我的利益。它也有助于我学习。]