0

根据文档 默认实现什么都不做。

但是......我从 drawRect 方法抛出异常,我看到下一个调用堆栈

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

据我所知,这意味着 -[CALayer drawInContext:] 调用委托方法的默认实现。这是对的吗?因为我知道调酒技术,所以我不确定 Objective-C 中的任何内容......

4

1 回答 1

4

你是正确的,CALayer 的默认值drawInContext:什么都不做。这是真的,除非该层有一个委托并且该层的委托实现了drawLayer:inContext:. 所以文档的问题是它应该在声明“默认实现什么都不做”旁边有一个小星号。

请记住,所有视图都以某种 CALayer 为后盾。该层会自动设置为将其视图设置为其委托。表面上不明显的是 UIView 确实实现了 CALayer 的 delegate drawLayer:inContext:。这就是您在调用堆栈上的所有这些调用中看到的。

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

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

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

于 2012-01-14T01:13:43.903 回答