【发布时间】:2026-02-22 21:00:01
【问题描述】:
我正在浏览 Apple 提供的 Programming with Objective-C 文档。
我正在尝试理解以下段落,但到目前为止,无法理解。
@protocol XYZPieChartViewDataSource
- (NSUInteger)numberOfSegments;
- (CGFloat)sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
@optional
- (NSString *)titleForSegmentAtIndex:(NSUInteger)segmentIndex;
@required
- (UIColor *)colorForSegmentAtIndex:(NSUInteger)segmentIndex;
@end
@interface XYZPieCharView : UIView
@property (weak) id <XYZPieChartViewDataSource> dataSource;
// some additional stuff
@end
如果您尝试在 id 上调用 respondsToSelector: 方法 符合上面定义的协议,你会得到一个 编译器错误,它没有已知的实例方法。一旦您 使用协议限定 id,所有静态类型检查都会返回; 如果你尝试调用任何未定义的方法,你会得到一个错误 在指定的协议中。避免编译器错误的一种方法是 设置自定义协议采用 NSObject 协议。
我对“符合协议”和“使用协议限定某些对象”之间的区别感到困惑。如果我们发送一个符合协议的 id - respondsToSelector 消息,为什么编译器会产生错误?
【问题讨论】:
-
到目前为止,我已经实现了许多协议数据源委托,我无法准确说出这句话想要解释什么。然而,我使用协议没问题。以我个人的拙见,我认为您应该在实际案例中实现它,看看它是如何工作的,并在需要协议时感受它是最快的学习方式。
标签: ios objective-c cocoa methods protocols