2010-02-02 36 views
4

我想我理解了(正式的)协议和类别之间的区别。现在,如果我理解正确,非正式协议应该是类别(通常在NSObject上定义),它们被用于某些目的(可能只是为了实现其中列出的一部分方法,而不是正式协议)。我需要确定它: 任何人都可以证实非正式协议只是一个类别(或解释差异)? 谢谢。类别与非正式协议

+0

下面是关于非正式协议http:// stackoverflow的非常好的解释。com/questions/2010058/informal-protocol-in-objective-c – 2014-10-31 17:01:41

回答

8

类别为类功能的扩展 - 这是一些方法的实现:

@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 
+0

非常感谢你 – user236739 2010-02-02 13:07:01

3

The Objective-C Manual说你是对的 - 非正式协议通常是类别。

但是,你可以实现一个非正式的协议只是由字同意其

除了正式的协议,也可以通过在一个类别声明分组的方法定义了一个非正式协议口 - 当我在实现接口构建器的委托方法时,我从来没有想过寻找一个类别;和类别除了非正式协议外也用于other things

+0

非常感谢你 – user236739 2010-02-02 13:05:46

5

非正式协议实际上就是在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 
+0

非常感谢你 – user236739 2010-02-02 13:07:52

0

协议只是一个接口的定义。

一个类别(针对NSObject)既是一个接口的定义,也是该接口的一个实现,NSObject的所有子类都将继承该接口,除非它们覆盖该类别的方法。

尽管Apple在过去选择通过创建NSObject类别来定义非正式协议并不意味着其中一个是另一个的定义。

事实上,你可以通过声明接口而不是实际实现它来半定义一个类,因为Objective-C编译器肯定会抱怨“不完整”实现'为真实接口。但他们已经被滥用了足够长的时间,以至于你可以预期行为不会改变。