Objective-C 之类目(category)的应用
2013-12-22 17:27
477 查看
类目(Category)
Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,我们可以为任何已经存在的class添加方法(不包括数据成员)却不需要访问该class的实现文件。
新添加的方法和原有的方法具有同等的地位,可以访问class的数据成员,并且完全植入到class的继承体系之中,子类同样会继承新添加的方法。利用category对类进行扩展可以避免使类的继承体系过于臃肿,复杂,降低了维护成本。另外,新添加的方法如果和已经存在的方法具有相同的prototype,那么新添加的方法将会覆盖已经存在的方法,也就是category使得在没有源文件时修改已存在class的functionality或者清除bug成为可能,所有该class的对象的行为都将发生变化,这一点是继承无法达到的。
Category的缺点:
如果一个已经存在的方法被新方法覆盖,那么将没有任何途径可以对旧方法进行调用。这一点和继承是不同的,子类对父类成员函数重写(override),但我们依然可以对父类中的被重写的成员函数进行调用。
如果有多个category对同一个class的成员函数进行重写,那么具体的行为是未定义。
Category的应用:
对类进行扩展或patch。
使用category或(anonymous category)来模拟实现private method。
使用category(informal protocol)来实现delegation,在cocoaframework中就大量使用了category来声明delegate methods。
利用category把一个庞大的class划分为小块儿来分别进行开发,从而将functionality更好的进行划分,利于维护。
类目,算是Objective-C中最有用的一个特性了。从上面的介绍,我们可以总结出,本质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节。这是特别有用的,因为你可以给一个内建的对象添加方法。比如,当你想在你的应用程序里面给所有NSString类型的实例添加一个方法,你只需要添加一个类目,而不需要通过定义一个子类来添加该方法。比如,我想给NSString添加一个方法以判断它是不是一个URL,写法就像这样:
头文件“NSString-Utilities.h”:
#import <Cocoa/Cocoa.h>
@interface NSString (Utilities)
- (BOOL) isURL;
@end
这很像一个类的声明。不同的地方在于后面没有列出父类,并且在括号里面写了类目的名称。类目的名字可以随便取,但是最好能表达出你在类目中包含的方法所要做的事。
下面是一个实现。切记,这不是很好的检查URL的方法。我们只是为了说清楚类目的概念。
.m实现文件:
#import "NSString-Utilities.h"
@implementation NSString (Utilities)
- (BOOL) isURL
{
if ( [self hasPrefix:@"http://"])
return YES;
else
return NO;
}
@end
现在,你可以使用NSString的这个方法了,下面的代码会在控制台打印“string1 is a URL”:
[java] view
plaincopyprint?
NSString* string1 =@"http://www.digu.com/";
NSString* string2 =@"digu";
if ( [string1 isURL] )
NSLog (@"string1 is a URL");
if ( [string2 isURL] )
NSLog (@"string2 is a URL");
与子类不同,你不能通过类目来添加实例变量。但是你能通过类目重写(override)类中已经存在的方法,当然,重写的时候要特别小心。
记住,当你通过类目更改一个类的时候,这个更改会影响你这个应用程序中所有这个类的实例。
Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,我们可以为任何已经存在的class添加方法(不包括数据成员)却不需要访问该class的实现文件。
新添加的方法和原有的方法具有同等的地位,可以访问class的数据成员,并且完全植入到class的继承体系之中,子类同样会继承新添加的方法。利用category对类进行扩展可以避免使类的继承体系过于臃肿,复杂,降低了维护成本。另外,新添加的方法如果和已经存在的方法具有相同的prototype,那么新添加的方法将会覆盖已经存在的方法,也就是category使得在没有源文件时修改已存在class的functionality或者清除bug成为可能,所有该class的对象的行为都将发生变化,这一点是继承无法达到的。
Category的缺点:
如果一个已经存在的方法被新方法覆盖,那么将没有任何途径可以对旧方法进行调用。这一点和继承是不同的,子类对父类成员函数重写(override),但我们依然可以对父类中的被重写的成员函数进行调用。
如果有多个category对同一个class的成员函数进行重写,那么具体的行为是未定义。
Category的应用:
对类进行扩展或patch。
使用category或(anonymous category)来模拟实现private method。
使用category(informal protocol)来实现delegation,在cocoaframework中就大量使用了category来声明delegate methods。
利用category把一个庞大的class划分为小块儿来分别进行开发,从而将functionality更好的进行划分,利于维护。
类目,算是Objective-C中最有用的一个特性了。从上面的介绍,我们可以总结出,本质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节。这是特别有用的,因为你可以给一个内建的对象添加方法。比如,当你想在你的应用程序里面给所有NSString类型的实例添加一个方法,你只需要添加一个类目,而不需要通过定义一个子类来添加该方法。比如,我想给NSString添加一个方法以判断它是不是一个URL,写法就像这样:
头文件“NSString-Utilities.h”:
#import <Cocoa/Cocoa.h>
@interface NSString (Utilities)
- (BOOL) isURL;
@end
这很像一个类的声明。不同的地方在于后面没有列出父类,并且在括号里面写了类目的名称。类目的名字可以随便取,但是最好能表达出你在类目中包含的方法所要做的事。
下面是一个实现。切记,这不是很好的检查URL的方法。我们只是为了说清楚类目的概念。
.m实现文件:
#import "NSString-Utilities.h"
@implementation NSString (Utilities)
- (BOOL) isURL
{
if ( [self hasPrefix:@"http://"])
return YES;
else
return NO;
}
@end
现在,你可以使用NSString的这个方法了,下面的代码会在控制台打印“string1 is a URL”:
[java] view
plaincopyprint?
NSString* string1 =@"http://www.digu.com/";
NSString* string2 =@"digu";
if ( [string1 isURL] )
NSLog (@"string1 is a URL");
if ( [string2 isURL] )
NSLog (@"string2 is a URL");
与子类不同,你不能通过类目来添加实例变量。但是你能通过类目重写(override)类中已经存在的方法,当然,重写的时候要特别小心。
记住,当你通过类目更改一个类的时候,这个更改会影响你这个应用程序中所有这个类的实例。
相关文章推荐
- Objective-C 之类目(category)的应用
- Objective-C 之类目(category)的应用
- Objective-C - 分类(类别)的应用 Category
- Objective-C学习笔记(二)–Category和Extension
- objective-c 中isMemberOfClass的使用举例isKindOfClass的应用举例
- Objective-C category 为现有的类添加新方法的方式。
- 【Objective-C学习-6】Category
- [置顶] Objective-C,/,ios,/iphone开发基础:分类(category,又称类别)
- objective-c中Category类别(扩展类)专题总结
- 【Objective-C】OC中类别(Category)基本概念与用法
- Objective-C——消息、Category和Protocol
- 刨根问底Objective-C Runtime(3)- 消息 和 Category
- iOS应用开发最佳实践:编写高质量的Objective-C代码
- iOS学习(二十二)Objective-C 动态识别的应用
- 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
- Objective-c Category(类别)
- 在 Objective-C 中对 Block 应用 property 时的注意事项
- Objective-C 日记⑨ 类别Category
- Objective-C相关Category的收集(更新)
- Objective-C相关Category的收集