Iphone Objective-C协议和类别是否可以继承?

Iphone Objective-C协议和类别是否可以继承?,iphone,objective-c,ios,protocols,objective-c-category,Iphone,Objective C,Ios,Protocols,Objective C Category,我对Objective-C协议和类别的一些概念有点困惑 协议和类别是否可以由Objective-C中的子类继承?类别就像是类的扩展。您可以将自己的方法添加到其他类(例如NSString或任何其他类)。这意味着任何子类都可以获得方法 然而,协议是一个方法列表,需要向其确认的类来实现所有方法(除非它使用@optional标记)。所以它的子类没有继承它的意义 编辑: 对于协议的实现,我意识到我不够清楚。在它的超类中实现的协议方法可以被继承,但是,我的意思是通常不需要重写超类的协议方法。您的问题还不清楚

我对Objective-C协议和类别的一些概念有点困惑


协议和类别是否可以由Objective-C中的子类继承?

类别就像是类的扩展。您可以将自己的方法添加到其他类(例如NSString或任何其他类)。这意味着任何子类都可以获得方法

然而,协议是一个方法列表,需要向其确认的类来实现所有方法(除非它使用@optional标记)。所以它的子类没有继承它的意义

编辑:


对于协议的实现,我意识到我不够清楚。在它的超类中实现的协议方法可以被继承,但是,我的意思是通常不需要重写超类的协议方法。

您的问题还不清楚。您可能会问,子类是否继承其超类的协议和类别@MateurProgrammer已经回答了这个问题

您可能还会问,类别和协议本身是否可以从其他类别和协议继承。对于类别,答案是否定的。对于协议,答案是肯定的,事实上,协议应该总是像这样继承类:

@protocol SomeProtocol <NSObject>
...
@end
@protocol-SomeProtocol
...
@结束

这意味着任何符合
的东西也符合
(它既是一个协议,也是一个类)。这允许您调用方法,如
respondsToSelector:
,这对于大多数协议实现非常重要。

类别是在运行时添加到类中的方法集合。因为Objective-C使用动态绑定,这意味着类及其所有子类都可以使用在类别中定义的方法。具体来说,选择器是在方法被调用时绑定到方法的,而不是在编译期间或程序首次加载时。类别在类(类别)加载时添加到类中

协议定义了方法签名的集合,符合它们的类承诺实现这些方法签名。一旦一个类声明它符合一个协议,它的方法就好像是在该类的接口中声明的,继承规则是完全相同的:子类继承协议方法的声明和实现,但也可以选择覆盖超类实现


协议本身可以扩展以产生新的协议。由原始协议中方法的超集组成。事实上,正如大多数类继承自
NSObject
类一样,大多数协议扩展了
NSObject
协议(协议名称和类名位于不同的名称空间)。这使得声明为
id
的对象可以发送基本消息,如
-retain
-release
等,而无需生成编译器警告。

协议类似于Java中的接口。因此,类提供了访问它的协议

您可以“子类化”协议,就像在Java中您可以“子类化”接口一样

另一方面,类别是向类添加更多方法的一种方式。限制是不能添加任何带有类别的实例变量。您只能访问现有的实例变量

但它非常有用,因为它避免了创建大型脆弱的子类层次结构

所以,底线是,如果您想让不同的类视图符合标准接口,那么就使用协议。如果您想在现有类中添加一些方法而不需要子类化,那么可以选择一个类别

然而,要记住的一点是,当你向一个类别中添加方法时——我的同事们提醒过我这一点——你让这些方法无处不在。我在一些地方读到过,一个常见的新手错误是对分类发疯,总是使用它们,而不是创建新的类来完成这项工作


因此,如果您正在考虑的新类别方法确实是特定的或与业务功能紧密耦合的,那么它可能不应该是类别。它们实际上应该只用于基类的泛型添加。

NSObject符合NSObject协议

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}
if ([FTGAnimal conformsToProtocol:@protocol(NSObject)]) {
        NSLog(@"FTGAnimal conforms to NSObject protocol");
}
我们可以看到FTGAnimal实际上符合NSObject协议

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}
if ([FTGAnimal conformsToProtocol:@protocol(NSObject)]) {
        NSLog(@"FTGAnimal conforms to NSObject protocol");
}

更具体地说:子类继承其父类的协议一致性。如果一个类符合,那么它的子类也符合。是的,这就是我说的。谢谢。这个答案的一半是对原始问题的评论。另一方面,它回答了我今天的问题,所以+1。谢谢。流行的例子是:@protocol-UITableViewDelegate。