码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C基础6 : 类别category

时间:2015-02-02 00:38:22      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

1.为什么要有类别?在现有类的基础上做扩展,可以采用继承和组合两种方法来实现,但是OC为什么还要有类别这种方式呢?

想想这样一个应用场景,要创建一个字典,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);

 代码清爽简单多了!!!!

3.类别优缺点。

类别缺陷:1)无法添加成员变量 2)容易造成名字冲突。当名字冲突的时候类别中的方法具有高优先级,他将覆盖其他同名名字变成可见的。

类别优点:1)可以将实现代码分散到不同文件或者框架里面去。2)创建对私有方法的引用 3)向对象添加非正式协议(informal protocol)

 

Objective-C基础6 : 类别category

标签:

原文地址:http://www.cnblogs.com/52xpz/p/4266542.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!