Objective-C:分类(Category、extension)

简介:
分类(Category 、Extension)
(一)分类的划分
 
  (2) 1、(命名的类别)类别 Category:只能添加新的方法,不能添加新变量。
  
       2、(未命名的类别)类的扩展 Extension://扩展一般直接写在类的实现文件中

                                       //扩展中定义的都是类中私有的实例变量和方法       

(二)分类的使用

(1)分类只能增加方法(包括类方法和对象方法),不能增加成员变量

(2)在分类方法的实现中可以访问原来类中的成员变量;

(3)分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用(警告);

(4)方法调用的优先级:分类->原来的类->父类,若包含有多个分类,则最后参与编译的分类优先;

(5)在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求。

(6)在大规模的应用中,通常把相应的功能写成一个分类,可以有无限个分类,对原有类进行扩充,一般分模块写,一个模块一个分类。

 //自定义的字符串类String

复制代码
 1 //  String.h
 2 //  类别
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 
10 @interface String : NSObject
11 @property(nonatomic,strong)NSString* string;
12 -(id)initWithString:(NSString*) str;
13 -(void)print;
14 @end
复制代码
复制代码
 1 //  String.m
 2 //  类别
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "String.h"
 9 //#import "String_String_private.h"//在String类单独导入一个类扩展文件
10 
11 //类扩展extension,添加的属性str1和show方法都是私有的,只能在String类中可以访问得到
12 @interface String()//直接将类扩展文件写入String类的实现中
13 {
14     NSString *str1;
15 }
16 -(void)show;
17 @end
18 
19 
20 @implementation String
21 -(id)initWithString:(NSString*) str
22 {
23     self = [super init];
24     if(self)
25     {
26         _string = str;
27     }
28     return self;
29 }
30 -(void)show
31 {
32     NSLog(@"string is runing");
33 }
34 -(void)print//通过print方法访问到类扩展中添加的属性和方法
35 {
36     [self show];
37     NSLog(@"%@",_string);
38 }
39 @end
复制代码

 

//单独的类扩展文件

复制代码
 1 //  String_String_private.h
 2 //  类别
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "String.h"
 9 
10 @interface String ()
11 {
12     NSString *str1;
13 }
14 //@property(nonatomic,strong)NSString* str1;
15 -(void)show;
16 @end
复制代码

 

//类别文件

复制代码
 1 //  String+Count.h
 2 //  类别
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "String.h"
 9 //String的类别Count,添加的方法,对String类进行功能的扩展(切记:类别中只能添加方法)
10 @interface String (Count)
11 -(NSInteger) nmuberOfString: (NSString *)str;
12 -(NSInteger) numberOfCount: (NSString *)str;
13 @end
复制代码
复制代码
 1 //  String+Count.m
 2 //  类别
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "String+Count.h"
 9 
10 @implementation String (Count)
11 -(NSInteger) nmuberOfString: (NSString *)str
12 {
13     NSInteger count = 0;
14     for(int i=0;i<str.length;i++)
15     {
16         unichar ch = [str characterAtIndex:i];
17         if(ch>='0' && ch<='9')
18             count++;
19     }
20     return count;
21 }
22 -(NSInteger) numberOfCount: (NSString *)str
23 {
24     NSInteger count = 0;
25     for(int i=0;i<str.length;i++)
26     {
27         unichar ch = [str characterAtIndex:i];
28         if(ch>='0' && ch<='9')
29             count++;
30     }
31     return count;
32 }
33 @end
复制代码

 

//主函数测试

复制代码
 1 //  main.m
 2 //  类别
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 #import "String+Count.h"
10 #import "String.h"
11 int main(int argc, const char * argv[])
12 {
13     @autoreleasepool
14     {
15        //测试类扩展(未命名的类别)   关键字:extension
16        String *string = [[String alloc]initWithString:@"xiayuan"];
17       [string print];
18         
19         
20        //测试类别(命名的类别)      关键字:Category
21        NSInteger a = [string nmuberOfString:@"xu3984jjsn6ew32"];
22        NSLog(@"a = %ld",a);
23         
24        NSInteger b = [string numberOfCount:@"36y3jfse93u4gdf8"];
25        NSLog(@"b = %ld",b);
26     }
27     return 0;
28 }
复制代码

//运行结果

复制代码

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

复制代码
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4724612.html,如需转载请自行联系原作者
目录
相关文章
|
Java iOS开发 C++
Objective-C类别(category)和扩展(Extension)的基本概念
Objective-C类别(category)和扩展(Extension)的基本概念
170 0
|
测试技术 iOS开发
|
JavaScript iOS开发 C++
|
iOS开发 编译器 开发者
Objective-C中Extension与Category的使用
Objective-C 2.0增加了class extensions用于解决两个问题: 允许一个对象可以拥有一个私有的interface,且可由编译器验证。
867 0
|
4天前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
108 2
|
4天前
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
17 2
|
4天前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
82 0
|
编译器 API iOS开发
iOS 代码规范格式 Objective-C(下)
iOS 代码规范格式 Objective-C(下)
193 0