IOS类目

转自:http://blog.csdn.net/lwjok2007/article/details/47081371

首先我们解释一下类目是什么

iOS中类目是为给已经存在的类添加新的方法。(但是不能添加实例变量)

也就是说 我们已经有一个类了 ,但是我们发现这个类目前所提供的方法,满足不了我们的需求,我们需要新的方法,但是我们有不想或者不能动这个类的原始写法,此时类目就可以实现不用动这个类的情况下 为他添加新的方法。

比如说:

假如,我们把人看作一个类,我们对人的定义包括吃饭,睡觉,穿衣等等。 他的方法包括了 如何吃饭,如何穿衣,如何睡觉等等

但是,有一天汽车出现了,我们发现我们之前对人的定义没有 开汽车这个方法,但是大家对人的定义都已经打包了。不能再去改人这个类的源代码了。

这时候我们可以通过类目来给人添加一个开汽车的方法,此时我们不需要修改人的属性,人还是一个脑袋,两只胳膊,两条腿,但是人的方法多了一个开汽车。


一般在系统提供的类中会使用到,比如说NSString 我们只能看到.h方法,看不到.m方法。

我们要想给它添加一个方法,可是操作不了.m的。此时就可以使用类目来实现。


下边我们以一个例子来看一下。

比如说NSString 我们想给他添加一个urlecode urldecode两个方法

我们新建一个类(一般的起名规则是 原始类名+自己起一个名字)比如说给NSString添加url相关方法。我们起名NSString+URL

类名的写法:【原始类名:(自己起的名字)】

.h文件如下

[objc]  view plain  copy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface NSString(URL)  
  4.   
  5. -(NSString *)URLEncodedString;  
  6.   
  7. -(NSString *)URLDecodedString;  
  8.   
  9. @end  


我们给他添加了两个方法

URLEncodedString();

URLDecodedString();

我们再来看.m文件

[objc]  view plain  copy
  1. #import "NSString+URL.h"  
  2.   
  3. @implementation NSString(URL)  
  4.   
  5. -(NSString *)URLEncodedString  
  6. {  
  7.     // CharactersToBeEscaped = @":/?&=;+!@#$()~',*";  
  8.     // CharactersToLeaveUnescaped = @"[].";  
  9.       
  10.     NSString *encodedString = (NSString *)  
  11.     CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,  
  12.                                                               (CFStringRef)self,  
  13.                                                               NULL,  
  14.                                                               (CFStringRef)@"!*'();:@&=+$,/?%#[]",  
  15.                                                               kCFStringEncodingUTF8));  
  16.       
  17.     return encodedString;  
  18. }  
  19.   
  20. -(NSString *)URLDecodedString  
  21. {  
  22.       
  23.     NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)self, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));  
  24.       
  25.     return decodedString;  
  26. }  
  27.   
  28. @end  


我们看到 除过类名写法特殊以外其他方法的实现等 和一般类的写发都相同


这个时候我们就给NSString 类添加了两个新的方法。那么如何使用了?

在我们需要使用的类中 记得导入我们新建的类目

[objc]  view plain  copy
  1. #import "NSString+URL.h"  


然后我们就可以在导入了 类目的类中 用NSString 的对象调用  URLEncodedString();  URLDecodedString();这两个方法了 ,就好像NSString 本身就有这两个方法一样


[objc]  view plain  copy
  1. NSString *readyEcodeStr=@"adsfa asdfa s+asdf";//准备urlecode的字符串    
  2.     NSString *ecodeStr=[self URLEncodedString:readyEcodeStr];    
  3.     NSLog(@"readyEcodeStr=%@  ecodeStr=%@",readyEcodeStr,ecodeStr);  

我们 看到上边的NSString对象 readyEcodeStr 调用方法URLEncodedString 方法和普通的调用没什么两样


最终结果如下

readyEcodeStr=adsfa asdfa s+asdf  

ecodeStr=adsfa%20asdfa%20s%2Basdf

(这个例子中的urlencode,urldecode 方法的一般实现我们可以参考:http://blog.csdn.net/lwjok2007/article/details/47023853)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值