Objective-C中的协议(Protocol)和类别(Category)

1.什么是协议?

2.协议与类别的声明和使用

1.什么是协议?

  在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议。协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承。

  协议包括正式协议和非正式协议。

  正式协议:其声明一个方法列表,协议的实现者需要实现声明的方法,可以使用@required和@optional关键字指定方法必须实现或可选实现,默认为必须实现。子类会继承其父类采用的协议,一个协议本身也可以采用别的协议

  非正式协议(类别):类别是Objective-C的一个语言特点,可以让你在无需子类化的前提下为一个类增加方法。凡是NSObject或其子类的类别,都是非正式协议。一个类不必实现非正式协议中的每个方法,只需实现它想要的方法就可以。声明非正式协议的类在向某个目标对象发送协议消息之前,必须首先向它发送respondsToSelector:消息并得到肯定的回答,才可以使用。

2.协议与类别的声明和使用

  正式协议的声明很简单,在类声明的上方

@protocol ProtocolName

//方法声明

@end

在另一个采纳协议的类中声明

@interface ClassName:NSObject<NSCopying>

{

//实例变量

}

//方法

@end

  也可以采用多个协议,只需用逗号隔开

@interface ClassName:NSObject<NSCopying,NSCoding>

{

//实例变量

}

//方法

@end

  声明可选和必须实现的协议

@protocol ProtocolName
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end//MyProtocol

  非正式协议(类别)声明和使用,类别名也要符合骆驼命名法。类别的声明和实现可以放在单独的 ”类别名.h/类别名.m“中,也可以放在已有类的.h/.m文件中。

@interface ClassName(categoryName)

//方法定义

@end

  实现

@implementation ClassName(categoryName)
//方法实现
@end

  需要注意的是类别只能添加方法,不能添加实例变量。

------------------------------------------------------------------------------------------------------------------------

  不声明类别名的时候,是匿名类别或类扩展,可以为已存在的类添加实例变量,方法。只能放置在已有类的.h/.m中

@interface ClassName(){

  //实例变量--只能在自身类内使用

}

//方法定义--在.h文件中声明为公开的,在.m中声明的方法为私有的。

@end

Objective-C中的协议(Protocol)和类别(Category)

时间: 2024-12-21 15:17:43

Objective-C中的协议(Protocol)和类别(Category)的相关文章

Xcode 6.3 之后扩展:Extension、协议:Protocol、分类:Category 都到哪里去了?

新的Xcode中这三个文件类型被放到一块去了: 选中 Objective-C File 后, 出现下面的页面就可以选择了:

Objective-C 13 协议protocol

Objective-C中的协议@protocol,与java中的接口interface类似,其中列出的方法,本类不需要实现,而由实现此协议的类来实现这些方法. 1 声明协议protocol 格式: @protocol 协议名 ....方法 @end 两种方法: 1直接在某个类中声明.例如:协议NSObject是在NSObject.h文件中声明. @protocol NSObject - (BOOL)isEqual:(id)object; @property (readonly) NSUInteg

Objective中的协议(Protocol)

作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法声明. 协议的声明: @protocol 协议名称 <NSObject> //方法的声明; @end 新建1个协议的方式. NewFile OC-File - protocol 协议的文件名: .h 并且只有1个.h文件. 在协议中,只能用来声明方法,协议的作用:就是专门用来写方法声明的. 类遵守协议: 如果想要让1个类,拥有协议中定义的所有的

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ

【iOS】Swift中扩展extension与协议protocol

一起连带前面几篇Playground小结代码都转到github上了,注释写了很多,主要方便自己以后可以翻翻看.Swift语法主要部分差不多就这些了.当然还有泛型.运算符重载.ARC.闭包之类的补充. 一.扩展(extension) 扩展 extension(类似OC中的分类,但Swift中没有名字), 即使在没有权限获取到原始代码的情况下,为类增加新功能. 注意: 只要定义了扩展, 那么该扩展对该类的实例都是可用的. extension SomeType{ //添加到SomeType的新功能写在

OC中协议Protocol的小结

//协议的基础语法 //遵从协议的类,可以声明出遵从协议的对象 Dog * dog = [[Dog alloc] init]; //普通id指针能指向任何对象,带协议的id只能指向遵从协议的类的对象 //Dog类遵从了MyProtocol协议,实现了协议中的方法 id <MyProtocol> obj = dog; //obj可以使用协议中定义的方法bark [obj bark]; // // main.m // 协议1-基础语法 // // Created by Macro on 14-12

类目 (category),扩展(Extension)和协议(protocol) (转)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式2.类目的局限性:1)类目无法向已有的类中添加实例变量: 2)如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,发生这种情况,则已有类的原始方法永无天日,最好的办法是将自己扩展的方法和原始方法区分开来. 3.类目的作用:?       将类的实现分散到多个不同的文件中–      将多个类目的声明放入同一个.h文件中–      将实现放入多个.m方法中?       使

协议 protocol

协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(formal protocol)------------------------------------------------------------------------------------声明正式协议使用@protocol指令,以@end结尾.@protocol MyXMLSupport- initFromXMLRepresentation:(NS