iOS类目

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

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

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

比如说:

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

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

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

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

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

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

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

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

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

.h文件如下

#import <Foundation/Foundation.h>

@interface NSString(URL)

-(NSString *)URLEncodedString;

-(NSString *)URLDecodedString;

@end

我们给他添加了两个方法

URLEncodedString();

URLDecodedString();

我们再来看.m文件

#import "NSString+URL.h"

@implementation NSString(URL)

-(NSString *)URLEncodedString
{
    // CharactersToBeEscaped = @":/?&=;[email protected]#$()~',*";
    // CharactersToLeaveUnescaped = @"[].";

    NSString *encodedString = (NSString *)
    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                              (CFStringRef)self,
                                                              NULL,
                                                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                              kCFStringEncodingUTF8));

    return encodedString;
}

-(NSString *)URLDecodedString
{

    NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)self, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

    return decodedString;
}

@end

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

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

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

#import "NSString+URL.h"

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

NSString *[email protected]"adsfa asdfa s+asdf";//准备urlecode的字符串
    NSString *ecodeStr=[self URLEncodedString:readyEcodeStr];
    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)

好了 类目我们就讲到到这。大家有什么不明白的 可以加群讨论

苹果开发群 :414319235  欢迎加入  欢迎讨论问题

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 17:28:50

iOS类目的相关文章

iOS类目、延展和协议

类目:为已知的类增加新的方法:注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用 1.类目无法向已有类中添加实例变量.2.如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用.3.在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来. 1.类目方法的应用: 1)对现有类进行扩展:如:可以扩展Cocoatouch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别. 2)作为子类的替代手段:

iOS -类目,延展,协议

1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意-(void)invert;//方法@end 实现部分 #import "NSMutableArray+Sort.h"@implementation NSMutableArray (Sort)

类的扩展--类目--ios

person+money.h  这是类目类 #import "Person.h" //这是扩展person类的接口类,独立一个文件 @interface Person (Money) -(void) haveMoney; @end person+money.m 这是类目类 #import "Person+Money.h" //这是扩展person类的实现类,独立一个文件 @implementation Person (Money) -(void) haveMoney

iOS开发OC基础:OC中的分类(类目)

//分类,category,(类目) //为没有源代码的类添加方法 //一定要注意,只能添加方法,不能添加实例变量 /** *  分类 类的定义也是分为接口部分和实现部分 接口部分:以@interface开头 + 类名 后跟小括号,小括号内填写的是分类名 @end结束 在@interface 与@end 之间添加方法. */ //分类为原类添加的方法,就相当于原类具有该方法,可以正常调用 因为涉及到几个分类的创建,所以就直接上传代码了,其实代码也不多,只是怕大家在建立分类的时候会混淆,所以直接把

iOS设计之--OC学习总结之延展类目协议

类目:为已知的类增加新的方法:延展:通知在本类的定义里使用类目来声明私有方法:协议:协议声明了可以被任何类实现的方法.注意:这些手段只能增加类的方法,并不能用于增加实例变量,要增加类的实例变量,只能通过定义子类来间接实现.1.类目1)声明类目@interface NSString (NumberConvenience)-(NSNumber *)lengthAsNumber;@end该声明具有2个特点.首先,现有类位于@interface关键字之后,其后是位于圆括号中的一个新名称.该声明表示,类别

iOS常用类目

发现慢慢积累了一大堆自己写的各种类的类目了..今天无私一把.都贴出来 1.NSDateFomatter @interface NSDateFormatter (MyCategory) + (id)dateFormatter; + (id)dateFormatterWithFormat:(NSString *)dateFormat; + (id)defaultDateFormatter; @end @implementation NSDateFormatter (MyCategory) + (id

iOS基础知识:类目、延展

一 .类目: 为已存在的类添加新的方法.但是不能添加实例变量. 应用:1.对现有的类进行扩展,如:系统中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别. 2.作为子类的替代方式,不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法. 3.对类中的方法进行归类,利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护. 4.和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明

objective-c 类目(Category)和延展(Extension)

类目的基本概念: 如果有封装好的一个类,随着程序功能的增加,需要在类中增加一个方法,那我们就不必在那个类中做修改或者再定义一个子类,只需要在用到那个方法时添加一个该类的类目即可. 1.在类目定义的方法中,会成为原始类的一部分,与其他方法的调用没有区别 2.通过给父类定义类目方法,其子类也会继承这些方法.如果子类添加类目方法,父类则不会拥有子类的类目方法. 类目方法的应用: 对现有类的扩展:在类目中增加的方法会被子类所继承,而且运行时跟其他的方法没有区别 作为子类的替代手段:不需要定义和使用一个子

淘宝-保证金缴纳的类目及对应金额(2017.3.25)

今天在上架商品,突然提示保证金1万,才能上架商品.请补交保证金,吓了宝宝一跳. 宝宝一个月才几十元的收入,交1万,逼死宝宝啊.  仔细查查资料才知道.消保的基础保证金是1000元保证金,特殊才是更高. 保证金缴纳的类目及对应金额 [原文](https://service.taobao.com/support/seller/knowledge-13123494.htm) 亲,以下各类目需要缴纳相应的保证金哦,具体金额可以参考以下的表格 类目 保证金金额 电动车/配件/交通工具>>电动车整车>