类目:为已知的类增加新的方法;注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用

1、类目无法向已有类中添加实例变量。
2、如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用。
3、在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来。

1、类目方法的应用:

1)对现有类进行扩展:如:可以扩展Cocoatouch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别。

2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法。

3)对类中的方法归类:利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。

2、类目方法的局限性:

1)无法向类目中添加

新的实例变量,类目没有位置来容纳实例变量。如果想增加类的实例变量,只能通过定义子类的方式。

2)如若,在类目中覆盖先后类的方法。这样会引起super消息的断裂,因为类目总的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法。

3、类目的定义:

类目的命名规则:类名+扩展方法,如“NSString+Revert”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用途。

4、举例说明:

NSString+Revert.h文件:

NSString+Revert.m文件:

延展:通知在本类的定义里使用类目来声明私有方法;

(1).延展的作用就是定义自己的私有方法。
(2).在自己类的实现文件中添加类目(匿名类目)来声明私有方法。(只有本类的.m文件中才能使用)。
(3).形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。

类的延展可看成是一种匿名的类目,类有时需要一些只有自己看得见的,所用的私有方法可以通过延展的方式来声明,延展中定义的方法在类本身的@implementation代码区域中进行实现。

当在定义延展的时候不提供类目名时,延展中定义的方法既被视为“必须实现”的API在这种情况下,如果方法没有实现代码,那么编译器会报警告,这个时候方法的实现就一定要出现在类主体的@implementation代码块中了。

协议

(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。

(2).协议不是类,只是一个其他对象可以实现的接口。

注意:

@required 必须方法 (默认)
@optional 可选方法

Girl.h文件中

#import <Foundation/Foundation.h>

#warning ▧▧▧▧▧▧▧▧▧▧ 1.声明协议 ▧▧▧▧▧▧▧▧▧▧
@protocol MarriageDelegate <NSObject> @required //必须方法(默认)
- (void)makeMoney;
- (void)satisfyHer;
@optional //可选方法
- (void)cooking; @end @interface Girl : NSObject #warning ▧▧▧▧▧▧▧▧▧▧ 2.设置代理人属性 ▧▧▧▧▧▧▧▧▧▧
@property (nonatomic, assign) id<Marriage> delegate;
- (void)buybuybuy; @end

Girl.m文件中

#import "Girl.h"

@implementation Girl

- (void)buybuybuy{
#warning ▧▧▧▧▧▧▧▧▧▧ 3.代理人执行方法 ▧▧▧▧▧▧▧▧▧▧
[self.delegate makeMoney];
} @end

Boy.h文件中

#import <Foundation/Foundation.h>
#import "Girl.h" #warning ▧▧▧▧▧▧▧▧▧▧ 4.签订协议 (当前类中要实现必须方法) ▧▧▧▧▧▧▧▧▧▧
@interface Boy : NSObject <MarriageDelegate> @end

Boy.m文件中

#import "Boy.h"

@implementation Boy

#warning ▧▧▧▧▧▧▧▧▧▧ 6.实现协议中声明的必须方法 ▧▧▧▧▧▧▧▧▧▧
- (void)makeMoney{
NSLog(@"赚钱");
} - (void)satisfyHer{
NSLog(@"亲吻");
} @end

协议演示

    //////////协议演示//////////

#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h" int main(int argc, const char * argv[]) { //////////使用代理//////////
Girl *girl = [[Girl alloc] init];
Boy *boy = [[Boy alloc] init];
#warning ▧▧▧▧▧▧▧▧▧▧ 5.指定代理人 ▧▧▧▧▧▧▧▧▧▧
girl.delegate = boy;
[girl buybuybuy];
//输出: 赚钱 //判断是否对象是否遵循某些协议
BOOL result = [girl conformsToProtocol:@protocol(Marriage)];
if (result) {
NSLog(@"遵循Marriage协议");
}else{
NSLog(@"不遵循Marriage协议");
}
//输出: 不遵循Marriage协议 return 0;
}

本文整理了简书Luisx的文章和51CTO蓝鸥张浩的博客,然后自己整理的,希望大家对类目、延展和协议有个新的认识。

iOS类目、延展和协议的更多相关文章

  1. iOS -类目,延展,协议

    1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...

  2. OC: 类的扩展、类的延展、协议、 NSDate

      NSDateFormatter 指定⽇日期格式: NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter ...

  3. iOS类目

    首先我们解释一下类目是什么 iOS中类目是为给已经存在的类加入新的方法.(可是不能加入实例变量) 也就是说 我们已经有一个类了 .可是我们发现这个类眼下所提供的方法,满足不了我们的需求,我们须要新的方 ...

  4. objective-c 类目(Category)和延展(Extension)

    类目的基本概念: 如果有封装好的一个类,随着程序功能的增加,需要在类中增加一个方法,那我们就不必在那个类中做修改或者再定义一个子类,只需要在用到那个方法时添加一个该类的类目即可. 1.在类目定义的方法 ...

  5. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  6. OC中协议, 类目, 时间, 延展, 属性

    只有继承和协议需要引IMPORT "头文件"; 必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @pr ...

  7. OC 中 类目、延展和协议

    Category : 也叫分类,类目. *是 为没有源代码的类 扩充功能 *扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承 *该方法只能扩充方法,不能扩充实例变量 ...

  8. object-c中的类目,延展,协议

    协议 协议只有方法的声明(类似于其他编程语言的接口)   协议相当于大家都所遵循的 关键字 @protocol 协议名 <所遵循的协议> 默认NSObject   @end     @pr ...

  9. 寒假 OC-代理,类目,内存,协议,延展,数组,字典,集合

     OC04字符串博客:1.http://www.cnblogs.com/heyonggang/p/3452556.html (字符串常用方法)2.http://blog.sina.com.cn/s/b ...

随机推荐

  1. HIVE HSQL 基本操作命令

    创建表: hive>create table tablename(id int,name string,password string); 创建一个名字为tablename的表,表的属性有int ...

  2. makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F) 含义

    makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)代表的不同含义 $(filter-out $(PHONY) $(wildcard $^),$^) 常 ...

  3. Don't add unneeded context不要加不需要的文本

  4. rapidjson代码封装类

    rapidjson代码封装类 以下代码封装了rapidjson增删改查等基本操作: /********************************************************* ...

  5. Android使用SVG小结

    SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形.它和位图(Bitmap)相对,SVG不会像位图一样因为缩放而让图片质量下降.它的优点在于节约空间,使用方便. andr ...

  6. poj2396有源汇上下界可行流

    题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...

  7. CTR点击率简介

    点击率 简介 在搜索引擎(百度.谷歌)中输入关键词后进行搜索,然后按竞价等因素把相关的网页按顺序进行排列出来,然后用户会选择自己感兴趣的网站点击进去:把一个网站所有搜索出来的次数作为总次数,把用户点击 ...

  8. Chrome Adobe flash player已过期怎么办

    越来越多的朋友感受到了来自谷歌chrome新版浏览器的压力,因为有不少朋友在使用新版chrome浏览器看视频时,却出现了这样的提示:Adobe flash player已过期!怎么办啊? 有网友抱怨: ...

  9. 《Effective C++》——条款04:确定对象使用前已先被初始化

    读取未初始化的值会导致不明确的行为.在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行.更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序 ...

  10. hdoj-1038-Biker's Trip Odometer(水题)

    题目真的考验英语 题目链接 需要进行单位的转换 对于Pi用:3.1415927. 5280步相当于1英里. 12英寸相当于1步. 60分钟等于1小时 60秒等于1分钟. 201.168米等于1弗朗.( ...