A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LZZ 中级黑马   /  2015-4-14 23:00  /  1733 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天给大家分享一下OC的Category技术。
一:当你想要为某个类新增方法时,你通常会继承它。然而这不一定是个完美的方法,特别是你想要重写一个类的的某个功能,但你却没有原始码。Categories 允许你在现有的类加入新功能,但不需要继承它。

例子一:
1,MyObjectCateName.h:
#import <Foundation/NSObject.h>  
#import "MyObject.h"  //该头文件已经定义了MyObject类  
//重点是这行:MyObject是已经存在的类,()里面是分类的名字,该分类扩展了之前MyObject的方法add和sub  
@interface MyObject(MyObjectCateName)  
-(MyObject*) add: (MyObject*) m;  
-(MyObject*) sub: (MyObject*) m;  
@end  

2,MyObjectCateName.m:
#import "MyObjectCateName.h"   
//重点是这行:MyObject是已经存在的类,()里面是分类的名字,该分类扩展了之前MyObject的方法add和sub  
@implementation MyObject(MyObjectCateName)  
-(MyObject*) add: (MyObject*) m {  
return [[MyObject alloc] initWithNumerator: numerator + [m numerator]];
}  
-(MyObject*) sub: (MyObject*) m {  
return [[MyObject alloc] initWithNumerator: numerator - [m numerator]];}  
@end  

二:同一个类只能有一个同名的category,其他的categories 得加上不同的、独一无二的名字,Categories 在建立私有方法时十分有用。因为OC并没有像Java 这private/protected/public methods 的概念,所以必须要使用categories 来达成这种功能。作法是把private method 从你的class header (.h) 文件移到implementation (.m) 文件。
例子2:
1,MyClass.h
#import <Foundation/NSObject.h>  
@interface MyClass: NSObject  
-(void) publicMethod;  
@end  

2,MyClass.m
#import <stdio.h>  
#import "MyClass.h"  
  
@implementation MyClass  
-(void) publicMethod {  
printf( "public method\n" );  
}  
@end  

// private methods  
@interface MyClass (Private)  
-(void) privateMethod;  
@end  

@implementation MyClass (Private)  
-(void) privateMethod {  
printf( "private method\n" );  
}  
@end  

三,如何使用Categories
对于在Objective-C中Categories的使用,有以下几种情况:
1)扩展已有的类
   举个例子,你可以向Cocoa框架中定义好的类中增加新的方法。新增的方法同时也会被子类继承,在运行时将无法区分这些方法是新增的还是原来类已经定义好的。
2)作为子类的替代方案
   除了通过定一个子类来扩展已有的类,你也可以通过Category直接向已有的类增加新的方法来实现。举例来说,你可以向NSArray和其它Cocoa类增加新的Categories来扩展已有的类。如同定义子类,你同样也不需要知道被扩展类的源代码。
3)通过使用多个代码文件来定义一个类
举个例子,你可以将一个规模比较大的类所有方法进行分组,然后将每组方法放到一个Category中,每个Category则用一个文件来定义。在开发过程中,这样的好处是显而易见的。
   提供一个简单的方法对相关的方法进行分组。不同的类中相似的方法可以统一放到相同的文件中,如果有多个开发人员需要同时实现一个类,通过将类的方法分成不 同的Categories可以简化代码管理 ,可以对一个规模非常大的类进行增量编译,减少重复编译的时间 ,可以将常用方法集中在一起,便于查找和参考 ,如果同一个类针对不同的应用有不同的实现,可以将不同的部分分别放入一个单独的文件中,以便代码的维护 。
4)可以申明非正式的协议(protocols)
尽管Objective-C能够允许使用Category覆盖重写类方法,甚至是定义在类接口中的方法,但强烈不建议这种用法。
Category不能完全代替子类,有以下几个最大的缺点:
当在Category中覆盖一个继承的方法,在Category中的方法可以通过向super类发送一个消息来调用被继承的方法。但是,如果 Category中覆盖的那个方法已经在这个类的其它Category定义过了,则之前定义的方法将没有机会被程序调用 ,在Category中无法确定其能够可靠的覆盖某个方法,而这个方法已经在其它的Category中定义过。这个问题在使用Cocoa框架时尤其突出。 当你想覆盖某个框架已经定义好的方法时,该方法已经在其它Category中实现,这样就无法确定哪个定义和实现会被最先使用,带来很大的不确定性。
如果你重新覆盖定义了一些方法,往往会导致这个方法在整个框架中实现发生了变化。举例来说,如果你增加了NSObject中windowWillClose:的实现,这会导致所有的窗口调用那个新实现的方法,从而改变所有NSWindows实例的行为。这会带来很多不确定性,并很有可能导致程序的崩溃。

评分

参与人数 2黑马币 +26 收起 理由
诗华语 + 6
guyinghua901018 + 20 很给力!

查看全部评分

20 个回复

倒序浏览
黑马币好多啊
回复 使用道具 举报
给个赞!
回复 使用道具 举报
。。。把自己总结的东西发到论坛可以得黑马币吗
回复 使用道具 举报
不懂。。。。
回复 使用道具 举报
桑小龙 发表于 2015-4-14 23:23
。。。把自己总结的东西发到论坛可以得黑马币吗

可以,要自己写
回复 使用道具 举报
棒棒哒:lol
回复 使用道具 举报
。。。。。。。。。。。
回复 使用道具 举报
学习了  感觉很不错的
回复 使用道具 举报
桑小龙 发表于 2015-4-14 23:23
。。。把自己总结的东西发到论坛可以得黑马币吗

你得发的有质量,自然就有豪来打赏了 呵呵
回复 使用道具 举报
赞一个,我是楼主:P
回复 使用道具 举报
写的好,支持下
回复 使用道具 举报
好主意,通常使用extensions建立私有的方法。。。扩展了知识
回复 使用道具 举报
详细~~~~~~
回复 使用道具 举报
LZZ 中级黑马 2015-4-15 20:26:50
15#
桑小龙 发表于 2015-4-14 23:23
。。。把自己总结的东西发到论坛可以得黑马币吗

可以啊,不过内容要有意义~~
回复 使用道具 举报
LZZ 中级黑马 2015-4-15 20:28:23
16#

谢谢,希望能帮助到大家~~
回复 使用道具 举报
LZZ 中级黑马 2015-4-15 20:29:38
17#

咱们都要加油~~向就业班冲锋
回复 使用道具 举报
LZZ 中级黑马 2015-4-15 20:30:48
18#
无声风铃 发表于 2015-4-15 08:38
好主意,通常使用extensions建立私有的方法。。。扩展了知识

嗯,OC很多东西要掌握~~咱们要掌握的还有很多~~
回复 使用道具 举报
LZZ 发表于 2015-4-15 20:29
咱们都要加油~~向就业班冲锋

必须的啊
回复 使用道具 举报
yesha 中级黑马 2015-4-15 21:16:59
20#
LZZ 发表于 2015-4-15 20:28
谢谢,希望能帮助到大家~~

交个朋友拉,相互学习:lol
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马