您的位置:首页 > 移动开发 > Objective-C

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

//  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: