1
#import <UIKit/UIKit.h>

@protocol myProtocol <NSObject>

-(void)aMethod;

@end

@interface ViewController : UIViewController

@property (weak) id<myProtocol> dSource;

@end

我试图牢牢掌握 Obj-c 协议,我正在阅读苹果文档来学习,我不清楚。以下是doc的要点:

  1. 饼图视图类接口需要一个属性来跟踪数据源对象。(上面的代码,我们大多是这样声明协议的,当我在我的类中声明协议时为什么需要一个跟踪对象,或者协议可以在独立的类中定义?为此我们需要跟踪对象?)

  2. 通过在属性上指定所需的协议一致性,如果您尝试将属性设置为不符合协议的对象,则会收到编译器警告。

  3. 如果您尝试在符合上面定义的协议的 id 上调用 respondsToSelector: 方法,您将收到一个编译器错误,即没有已知的实例方法。一旦你用协议限定了一个 id,所有的静态类型检查都会回来;如果您尝试调用未在指定协议中定义的任何方法,您将收到错误消息。避免编译器错误的一种方法是将自定义协议设置为采用 NSObject 协议。

4

1 回答 1

1
  1. 我不明白这个问题
  2. 正确,该属性要求该属性是符合您的属性的 id,如果您尝试将其设置为其他内容,编译器会正确地抱怨
  3. 这是因为 respondsToSelector: 是NSObject 协议上的一个方法,所以你可以让你的协议扩展NSObject (标准),或者你可以将属性声明为 NSObject
于 2013-02-06T12:04:51.030 回答