Objective-C:分类(Category、extension)
2015-08-12 15:48
357 查看
分类(Category 、Extension)
(一)分类的划分
(2) 1、(命名的类别)类别Category:只能添加新的方法,不能添加新变量。
2、(未命名的类别)类的扩展Extension://扩展一般直接写在类的实现文件中
//扩展中定义的都是类中私有的实例变量和方法
(二)分类的使用
(1)分类只能增加方法(包括类方法和对象方法),不能增加成员变量
(2)在分类方法的实现中可以访问原来类中的成员变量;
(3)分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用(警告);
(4)方法调用的优先级:分类->原来的类->父类,若包含有多个分类,则最后参与编译的分类优先;
(5)在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求。
(6)在大规模的应用中,通常把相应的功能写成一个分类,可以有无限个分类,对原有类进行扩充,一般分模块写,一个模块一个分类。
//自定义的字符串类String
//单独的类扩展文件
//类别文件
//主函数测试
//运行结果
2015-08-12 15:24:06.281 类别[1304:75695] string is runing
2015-08-12 15:24:06.282 类别[1304:75695] xiayuan
2015-08-12 15:24:06.282 类别[1304:75695] a = 7
2015-08-12 15:24:06.282 类别[1304:75695] b = 7
Program ended with exit code: 0
(一)分类的划分
(2) 1、(命名的类别)类别Category:只能添加新的方法,不能添加新变量。
2、(未命名的类别)类的扩展Extension://扩展一般直接写在类的实现文件中
//扩展中定义的都是类中私有的实例变量和方法
(二)分类的使用
(1)分类只能增加方法(包括类方法和对象方法),不能增加成员变量
(2)在分类方法的实现中可以访问原来类中的成员变量;
(3)分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用(警告);
(4)方法调用的优先级:分类->原来的类->父类,若包含有多个分类,则最后参与编译的分类优先;
(5)在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求。
(6)在大规模的应用中,通常把相应的功能写成一个分类,可以有无限个分类,对原有类进行扩充,一般分模块写,一个模块一个分类。
//自定义的字符串类String
// String.h // 类别 // // Created by ma c on 15/8/12. // Copyright (c) 2015年. All rights reserved. // #import <Foundation/Foundation.h> @interface String : NSObject @property(nonatomic,strong)NSString* string; -(id)initWithString:(NSString*) str; -(void)print; @end
// String.m // 类别 // // Created by ma c on 15/8/12. // Copyright (c) 2015年. All rights reserved. // #import "String.h" //#import "String_String_private.h"//在String类单独导入一个类扩展文件 //类扩展extension,添加的属性str1和show方法都是私有的,只能在String类中可以访问得到 @interface String()//直接将类扩展文件写入String类的实现中 { NSString *str1; } -(void)show; @end @implementation String -(id)initWithString:(NSString*) str { self = [super init]; if(self) { _string = str; } return self; } -(void)show { NSLog(@"string is runing"); } -(void)print//通过print方法访问到类扩展中添加的属性和方法 { [self show]; NSLog(@"%@",_string); } @end
//单独的类扩展文件
// String_String_private.h // 类别 // // Created by ma c on 15/8/12. // Copyright (c) 2015年. All rights reserved. // #import "String.h" @interface String () { NSString *str1; } //@property(nonatomic,strong)NSString* str1; -(void)show; @end
//类别文件
// String+Count.h // 类别 // // Created by ma c on 15/8/12. // Copyright (c) 2015年. All rights reserved. // #import "String.h" //String的类别Count,添加的方法,对String类进行功能的扩展(切记:类别中只能添加方法) @interface String (Count) -(NSInteger) nmuberOfString: (NSString *)str; -(NSInteger) numberOfCount: (NSString *)str; @end
// String+Count.m // 类别 // // Created by ma c on 15/8/12. // Copyright (c) 2015年. All rights reserved. // #import "String+Count.h" @implementation String (Count) -(NSInteger) nmuberOfString: (NSString *)str { NSInteger count = 0; for(int i=0;i<str.length;i++) { unichar ch = [str characterAtIndex:i]; if(ch>='0' && ch<='9') count++; } return count; } -(NSInteger) numberOfCount: (NSString *)str { NSInteger count = 0; for(int i=0;i<str.length;i++) { unichar ch = [str characterAtIndex:i]; if(ch>='0' && ch<='9') count++; } return count; } @end
//主函数测试
// main.m // 类别 // // Created by ma c on 15/8/12. // Copyright (c) 2015年. All rights reserved. // #import <Foundation/Foundation.h> #import "String+Count.h" #import "String.h" int main(int argc, const char * argv[]) { @autoreleasepool { //测试类扩展(未命名的类别) 关键字:extension String *string = [[String alloc]initWithString:@"xiayuan"]; [string print]; //测试类别(命名的类别) 关键字:Category NSInteger a = [string nmuberOfString:@"xu3984jjsn6ew32"]; NSLog(@"a = %ld",a); NSInteger b = [string numberOfCount:@"36y3jfse93u4gdf8"]; NSLog(@"b = %ld",b); } return 0; }
//运行结果
2015-08-12 15:24:06.281 类别[1304:75695] string is runing
2015-08-12 15:24:06.282 类别[1304:75695] xiayuan
2015-08-12 15:24:06.282 类别[1304:75695] a = 7
2015-08-12 15:24:06.282 类别[1304:75695] b = 7
Program ended with exit code: 0
相关文章推荐
- 我的iOS开发之Objective-C第4天之属性、复合
- java的eclipse操作和常用类Object的使用
- Object.wait()
- Objective-C:协议protocol
- Objective-C修饰符const
- JSONArray和JSONObject的简单使用
- ArcObject IFeature set_Shape()和Delete()报错
- Objective-C之run loop详解
- iOS规范化时间格式,object-C计算指定时间与当前的时间差
- 我的iOS开发之Objective-C第2天之面向对象特性之封装
- 关于Object类中equals方法的重写
- Objective-C Modernization Tool
- Objective-C——判断对象等同性
- 【Objective-C】构造方法description等
- JSONObject中取String 值的几种方法和对比
- JavaSE----API之常用类(Object、Scanner、String)
- Objective-C——判断对象等同性
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
- IOS基础:深入理解Objective-c中@class的含义
- 错误解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file