黑马程序员_分类
分类:可以给某一个类扩充一些方法(不修改原来类的代码)
分类一般以模块命名
好处:
1.一个庞大的类可以分模块开发
2.一个庞大的类可以由多个人来编写,更有利于团队合作
注意:
1.Category可以访问原始类的实例变量,但不能添加变量,只能添加方法,如果想添加变量,可以考虑通过继承创建子类。
2.Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法。
3.多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效。
格式:
// 声明
@interface 类名(分类名称)
// 分类不能增加成员变量
@end
// 实现
@implementation 类名(分类名称)
@end
/**
* 分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法。
*
* 使用注意:
* 1.分类只能增加方法,不能增加成员变量。
* 2.分类方法实现中可以访问原来类中声明的成员变量。
* 3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用。(在开发中不建议分类中实现以前的方法)
* 4.方法调用的优先级:分类(最后参与编译的分类优先) ---> 原来类 ---> 父类
*/
#import <Foundation/Foundation.h>
/**************** Person ****************/
@interface Person : NSObject
{
int _age;
}
@property int age;
- (void)test;
@end
@implementation Person
- (void)test
{
NSLog (@"Person --- test");
}
@end
/**************** Person(Cat1) ****************/
@interface Person (Cat1)
- (void)study;
@end
@implementation Person (Cat1)
- (void)study
{
NSLog (@"Person (Cat1) --- study: %d", _age);
}
- (void)test
{
NSLog (@"Person (Cat1) --- test");
}
@end
/**************** Person(Cat2) ****************/
@interface Person (Cat2)
@end
@implementation Person (Cat2)
- (void)test
{
NSLog (@"Person (Cat2) --- test");
}
@end
/**************** main ****************/
int main()
{
Person *p = [[Person alloc] init];
p.age = 10;
// 优先去分类中查找,然后再去原来类中找,最后再去父类中找。
[p test];
[p study];
return 0;
}
/**
* 1.给NSString增加一个类方法,计算某个字符串中阿拉伯数字的个数
* 2.给NSString增加一个对象方法,计算某个字符串中阿拉伯数字的个数
*/
#import <Foundation/Foundation.h>
/**************** NSString (Number) ****************/
@interface NSString (number)
/**************** 给NSString增加类方法 ****************/
+ (int)numberCountOfString: (NSString *)str;
/**************** 给NSString增加对象方法 ****************/
- (int)numberCount;
@end
@implementation NSString (Number)
+ (int)numberCountOfString: (NSString *)str
{
/*
// 1.定义变量计算数字的个数
int count = 0;
for (int i = 0; i < str.length; i++)
{
unichar c = [str characterAtIndex:i];
if ( c >= '0' && c <= '9' )
{
count++;
}
}
*/
// return count;
return [str numberCount];
}
- (int)numberCount
{
int count = 0;
for ( int i = 0; i < self.length; i++ )
{
// 取出i这个位置对应的字符
unichar c = [self characterAtIndex:i];
// 如果这个字符是阿拉伯数字就加一
if ( c >= '0' && c <= '9' )
{
count++;
}
}
return count;
}
@end
/**************** main ****************/
int main()
{
// int count = [NSString numberCountOfString: @"123456abcdef"];
int count = [@"123456abcdef" numberCount];
NSLog (@"%d", count);
return 0;
}