【Objective-C】12-分类



一、分类的作用

分类的英文名是Category,本身必须依赖于一个现有类,用于在不改变原来类的代码的基础上,为类扩充方法。使用分类,一个庞大的类可以分模块开发,可以由多个人来编写,更有利于团队合作。

二、类的声明和实现

2.1 分类的声明

@interface 类名 (分类名称)

@end

2.2 分类的实现

@implementation 类名 (分类名称)

@end

三、注意:

3.1 分类不能增加成员变量,只能增加方法。如果想添加变量,可以考虑通过继承创建子类。

3.2 分类方法实现中可以访问原来类中声明的成员变量。

3.3 分类方法的优先级最高。当调用一个方法时,优先到分类中查找同名方法,如果找不到,再到原来类中查找。如果还找不到,最后再到父类方法中查找。方法的优先级是:分类(最后参与编译的分类)——>原来类——>父类。即可以在分类中重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用(一般不建议这么使用)。

3.4 如果在不同的分类中实现了同一个方法,只有最后一个参与编译的才会有效,优先级跟编译器编译的顺序有关。可以在项目配置中调整顺序,方法如下:
  点击项目文件,在Build Phases->Complile Sources中调整分类的编译顺序。

四、与继承的区别

4.1 继承需要创建一个新的类,分类不需要;

4.2 继承可以增加新的成员变量,分类不能增加成员变量

 五、分类的应用场景

5.1 扩展系统类的类方法:当系统类无法满足开发需求时,可以扩展系统类方法。

5.2 扩展系统类的对象方法


#import <Foundation/Foundation.h>
@interface Person :NSObject

	@property int age;
	-(void)test;

@end

@implementation Person

	- (void)test
	{
		NSLog(@"Person-test");
	}

@end

//声明Person分类MM
@interface Person(MM)
{
	//double _height; // 分类不能增加成员变量
}

//声明一个跟原来类同名的方法
	-(void)test;
	-(void)test2;

@end

@implementation Person(MM)
	//实现跟原来类和分类JJ同名的分类方法,会覆盖掉原来类的同名方法。如果这个类是最后参与编译的分类方法,则调用这个方法实现
	- (void)test
	{
		NSLog(@"分类MM-test");
	}
	//扩充test2分类方法,分类方法中可以访问原来类中声明的成员变量
	-(void)test2
	{
		NSLog(@"分类MM-test2,age的值是%d", self.age);
	}

@end

//声明Person分类JJ
@interface Person(JJ)
	//声明一个跟原来类和分类MM同名的分类方法
	- (void)test;
@end
@implementation Person(JJ)

	//实现跟原来类和分类MM同名的分类方法,会覆盖掉原来类的同名方法。如果这个类是最后参与编译的分类方法,则调用这个方法实现
	- (void)test
	{
		NSLog(@"分类MM-test");
	}

@end
//给系统类增加分类方法
@interface NSString(Number)
	// 给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
	+ (int)numberCountFromNSString:(NSString *)str;
	// 给NSString增加一个对象方法:计算某个字符串中阿拉伯数字的个数
	-(int)numberCount;
@end

@implementation NSString(Number)
	// 给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
	+ (int)numberCountFromNSString:(NSString *)str
	{
		// 定义变量计算数字的个数
		int count = 0;
		for (int i = 0; i<str.length; i++)
		{
			// 返回字符串中下标指向的字符
			unichar c = [str characterAtIndex : i];
			//如果是数字,则计数器+1
			if (c >= '0'&&c <= '9')
			{
				count++;
			}
		}
		// 返回数字的个数
		return count;
	}

	// 给NSString增加一个对象方法:计算某个字符串中阿拉伯数字的个数
	-(int)numberCount
	{
		//调用类的分类方法
		return[NSString numberCountFromNSString : self];
		/*
		int count = 0;
		for(int i=0;i<self.length;i++)
		{
		unichar c = [self characterAtIndex:i];
		if(c>='0' && c <='9')
		{
		count++;
		}
		}
		return count;
		*/
	}


@end

int main()
{
	Person *p = [[Person alloc]init];
	[p test];
	p.age = 20;
	[p test2];

	int count = [NSString numberCountFromNSString : @"3adb334djk"];
	NSLog(@"通过分类类方法得出数字有%d个", count);
	count = [@"22ab3cd" numberCount];
	NSLog(@"通过分类对象方法得出数字有%d个", count);
}
输出结果:

2015-02-08 02:04:15.952 a.out[519:14781] 分类MM-test
2015-02-08 02:04:15.954 a.out[519:14781] 分类MM-test2,age的值是20
2015-02-08 02:04:15.955 a.out[519:14781] 通过分类类方法得出数字有4个
2015-02-08 02:04:15.955 a.out[519:14781] 通过分类对象方法得出数字有3个



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值