我想我理解了(正式的)协议和类别之间的区别。现在,如果我理解正确,非正式协议应该是类别(通常在NSObject上定义),它们被用于某些目的(可能只是为了实现其中列出的一部分方法,而不是正式协议)。我需要确定它: 任何人都可以证实非正式协议只是一个类别(或解释差异)? 谢谢。类别与非正式协议
类别与非正式协议
回答
类别为类功能的扩展 - 这是一些方法的实现:
@interface NSObject (MyCategory)
- (void)doSomething;
@end
...
@implementation NSObject (MyCategory)
- (void)doSomething {
// do something...
}
@end
正式的协议是完全不同的东西。如果你熟悉一些其他面向对象的语言,那么它就像接口(在Java,C++,C#等)。
协议可以连接到任何类实现这样的:
@protocol MyProtocol
@required
- (void)doSomething;
@optional
- (void)doSomethingOptional;
@end
...
@interface MyClass : NSObject <MyProtocol> {
}
@end
...
@implementation MyClass
- (void)doSomething {
// do something...
}
@end
根据该文件,非正式协议是NSObject类的类别(我从来没有用过这种方法):
@interface NSObject (MyInformalProtocol)
- (void)doSomething;
@end
...
@implementation NSObject (MyInformalProtocol)
- (void)doSomething {
// do something...
}
@end
非常感谢你 – user236739 2010-02-02 13:07:01
The Objective-C Manual说你是对的 - 非正式协议通常是类别。
但是,你可以实现一个非正式的协议只是由字同意其:
除了正式的协议,也可以通过在一个类别声明分组的方法定义了一个非正式协议口 - 当我在实现接口构建器的委托方法时,我从来没有想过寻找一个类别;和类别除了非正式协议外也用于other things。
非常感谢你 – user236739 2010-02-02 13:05:46
非正式协议实际上就是在NSObject上定义的简单类别,但是如果你定义了一个委托接口,还有更好的方法。相反,使用可选方法使用正式协议(即真实的,实际的@protocol定义)。这允许您在编译时测试委托类型(即它实际上符合协议),并在使用错误的对象时获得警告。
@protocol GLFunkyObjectDelegate
@optional
-(void)funkyObject: (GLFunkyObject *)obj willDoSomething: (GLSomeThing *)thing;
-(void)funkyObject: (GLFunkyObject *)obj didDoSomething: (GLSomeThing *)thing;
@end
@interface GLFunkyObject {
id <GLFunkyObjectDelegate> delegate;
}
//...
@end
非常感谢你 – user236739 2010-02-02 13:07:52
协议只是一个接口的定义。
一个类别(针对NSObject)既是一个接口的定义,也是该接口的一个实现,NSObject的所有子类都将继承该接口,除非它们覆盖该类别的方法。
尽管Apple在过去选择通过创建NSObject类别来定义非正式协议并不意味着其中一个是另一个的定义。
事实上,你可以通过声明接口而不是实际实现它来半定义一个类,因为Objective-C编译器肯定会抱怨“不完整”实现'为真实接口。但他们已经被滥用了足够长的时间,以至于你可以预期行为不会改变。
- 1. Objective-C中正式和非正式协议有什么区别?
- 2. 非正式协议在Objective-C?
- 3. 类别符合协议
- 4. 子类别诉讼协议
- 5. 在NSObject上使用非正式协议或使用可选方法的协议有什么区别?
- 6. Swift子类与协议
- 7. 通信协议:人类可读与非人类可读
- 8. 声明符合目标c协议与一个类别,并与另一类别
- 9. Objective-c - 类别和协议的目的
- 10. 测量协议 - 用户计时类别
- 11. 采用从类别的协议
- 12. 使用协议/委托另一类别
- 13. 正式描述协议的方式
- 14. 非正式协议的需求是什么?
- 15. 在非正式协议中委托变量
- 16. 协议与通用功能的关联类型协议
- 17. Swift:协议与结构与类对比
- 18. 与ActiveSync协议
- 19. Firebase XMPP协议与HTTP协议
- 20. Swift协议和协议扩展与CollectionType
- 21. 二进制协议与文本协议
- 22. 类与协议之间有什么区别
- 23. 如何实现协议一般与类别?
- 24. 正则表达式跳过协议url
- 25. 正则表达式PHP的URL协议
- 26. 协议未被识别
- 27. 识别传感器协议
- 28. XMPP与DDP协议
- 29. Swift中的超类与协议?
- 30. 与泛型类型的Swift协议
下面是关于非正式协议http:// stackoverflow的非常好的解释。com/questions/2010058/informal-protocol-in-objective-c – 2014-10-31 17:01:41