Objective-C基础6 : 类别category
2015-02-01 23:29
288 查看
1.为什么要有类别?在现有类的基础上做扩展,可以采用继承和组合两种方法来实现,但是OC为什么还要有类别这种方式呢?
想想这样一个应用场景,要创建一个字典,key是字符串,value是字符串的长度。一般的做法是:
由于NSMutableDictionary存储的key-value必须是OC对象,不能存储int等基本的c语言类型,所以上面dict中对象value长度必须是NSNumber类型,每存储一个长度都得调用NSNumber* num1 = [NSNumber numberWithUnsignedInt:[str length]]这行重复代码,类别就可以用来解决这类问题。
另外对于一些没有源码的类,比如NSString类,从NSString继承是一个很糟糕的选择,因为你无法知道NSString内部是怎么实现的,NSString会根据不同的初始化内部创建不同的对象,类别能解决这个问题。
2.类别个人感觉就像C里面的全局函数一样,比如上面的例子,可以传入一个长度,返回一个NSNumber*对象。类型的声明方法:在类的后面加入类别名称并且用括号括起来。
@interface NSString (NumberConvenience)
- (NSNumber *)lengthAsNumber;
@end
NumberConvenience实现很简单
利用协议解决1中重复代码问题如下:
代码清爽简单多了!!!!需要注意的是:一旦为一个类添加了一个类别,那么这个类别里面的方法就相当于是这个类实现的方法,并且这些类别方法可以在这个类及其子类进行调用。比如上面的lengthAsNumber方法NSMutableString也可以调用,强大不言而喻。
3.类别优缺点。
类别缺陷:1)无法添加成员变量 2)容易造成名字冲突。类别名称可能造成冲突,比如你创建了一个NumberConvenience,人家也创建了一个同名的NumberConvenience,编译不过;类别中的方法也有命名冲突,比如基于NSString的两个类别NumberConvenience和NumberConvenience1分别都有lengthAsNumber方法,OC无法决定调用哪个lengthAsNumber。解决方案是加前缀来命名!
类别优点:1)可以将实现代码分散到不同文件或者框架里面去。2)创建对私有方法的引用 3)向对象添加非正式协议(informal protocol)
想想这样一个应用场景,要创建一个字典,key是字符串,value是字符串的长度。一般的做法是:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; NSString* str = @"hello"; NSNumber* num1 = [NSNumber numberWithUnsignedInt:[str length]]; [dict setObject:num1 forKey:str]; str = @"world"; num1 = [NSNumber numberWithUnsignedInt:[str length]]; [dict setObject:num1 forKey:str]; NSLog (@"%@", dict);
由于NSMutableDictionary存储的key-value必须是OC对象,不能存储int等基本的c语言类型,所以上面dict中对象value长度必须是NSNumber类型,每存储一个长度都得调用NSNumber* num1 = [NSNumber numberWithUnsignedInt:[str length]]这行重复代码,类别就可以用来解决这类问题。
另外对于一些没有源码的类,比如NSString类,从NSString继承是一个很糟糕的选择,因为你无法知道NSString内部是怎么实现的,NSString会根据不同的初始化内部创建不同的对象,类别能解决这个问题。
2.类别个人感觉就像C里面的全局函数一样,比如上面的例子,可以传入一个长度,返回一个NSNumber*对象。类型的声明方法:在类的后面加入类别名称并且用括号括起来。
@interface NSString (NumberConvenience)
- (NSNumber *)lengthAsNumber;
@end
NumberConvenience实现很简单
@implementation NSString (NumberConvenience) - (NSNumber *)lengthAsNumber { NSUInteger length = [self length]; return ([NSNumber numberWithUnsignedInt:length]); } // lengthAsNumber @end
利用协议解决1中重复代码问题如下:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; NSString* str = @"hello"; [dict setObject:[str lengthAsNumber] forKey:str]; str = @"world"; [dict setObject:[str lengthAsNumber] forKey:str]; NSLog (@"%@", dict);
代码清爽简单多了!!!!需要注意的是:一旦为一个类添加了一个类别,那么这个类别里面的方法就相当于是这个类实现的方法,并且这些类别方法可以在这个类及其子类进行调用。比如上面的lengthAsNumber方法NSMutableString也可以调用,强大不言而喻。
3.类别优缺点。
类别缺陷:1)无法添加成员变量 2)容易造成名字冲突。类别名称可能造成冲突,比如你创建了一个NumberConvenience,人家也创建了一个同名的NumberConvenience,编译不过;类别中的方法也有命名冲突,比如基于NSString的两个类别NumberConvenience和NumberConvenience1分别都有lengthAsNumber方法,OC无法决定调用哪个lengthAsNumber。解决方案是加前缀来命名!
类别优点:1)可以将实现代码分散到不同文件或者框架里面去。2)创建对私有方法的引用 3)向对象添加非正式协议(informal protocol)
相关文章推荐
- Objective-C /iphone开发基础:分类(category,又称类别)
- Objective-C,ios,iphone开发基础:分类(category,又称类别)
- 【Objective-C基础】类别Category
- Objective-C ,ios,iphone开发基础:Category(分类,类别,范畴) ,UINavigationBar设置背景图片适配
- [置顶] Objective-C,/,ios,/iphone开发基础:分类(category,又称类别)
- Objective-C 类别(category)和扩展(Extension)
- objective-c category类别的使用
- Objective-C基础教程学习笔记(十二)类别
- objective-c中Category类别(扩展类)
- Objective-C中的类别(category)
- Objective-c Category(类别)
- 类别(objective-c基础笔记)
- Objective-C]OC中类别(Category)基本概念与用法
- Category 类别 -Objective-C
- 【Objective-C】OC中类别(Category)基本概念与用法
- objective-c中Category 类别、扩展 专题总结
- Category 类别 -Objective-C
- objective-c类别(Category)详细解说
- Objective-C category (类别) 和 protocol (协议)
- Objective-C中的类别(Category)的使用