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

【Objective-C学习笔记】核心语法——分类-Gategory

2015-04-05 09:58 323 查看
一、分类的基本使用
1、作用:在不改变原来类内容的情况下,可以为类增加一些方法
2、新建分类:New File --> OS X Source --> Objective-C File --> File Type选择Category
3、使用注意:

(1)分类只能增加方法,不能增加成员变量

(2)分类方法实现中可以访问用来类中声明的成员变量
#import <Foundation/Foundation.h>
// 原来类的声明
@interface Person : NSObject
{
int _age;    //年龄
}
@end
// 原来类的实现
@implementation Person
@end

// Person的分类
@interface Person (ceshi)
- (void)test2;
@end
// Person分类的方法实现
@implementation Person (ceshi)
- (void)test2
{
NSLog(@"------测试2,年龄=%d", _age);
}
@end

int main()
{
Person *p = [[Person alloc] init];
[p test2]; //------测试2,年龄=0

return 0;
}
(3)分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)test;
@end

@implementation Person
- (void)test
{
NSLog(@"Person-test方法");
}
@end

// Person的分类
@interface Person (ceshi)
- (void)test;
@end
// Person分类的方法实现
@implementation Person (ceshi)
- (void)test
{
NSLog(@"Person (ceshi)-test");
}
@end

int main()
{
Person *p = [[Person alloc] init];
[p test];    //<span style="font-family: Arial, Helvetica, sans-serif;">Person (ceshi)-test</span>

return 0;
}
(4)如果两个分类中有同名方法,那么按照编译的先后顺序来调用,后调用的方法会覆盖先调用的方法,从Xcode中可以查看编译的先后顺序。
//在上面的例子中继续添加一个分类
@interface Person (Study)
- (void)test;
@end

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

int main()
{
Person *p = [[Person alloc] init];
[p test];
return 0;
}
1> 先编译Person (ceshi),后编译Person (study),那么调用的是Person (study)中的- test方法



// 结果
Person (study)-test
2> 先编译Person (study),后编译Person (ceshi),那么调用的是Person (cash)中的- test方法



// 结果
Person (ceshi)-test
5、方法调用的优先级:优先找分类中的方法(分类中找后编译的分类中的方法),没有的话去原来类中找,还是没有的话再去父类中找。

二、分类的应用
1. 给NSString增加一个对象方法:计算某个字符串中阿拉伯数字的个数

2. 给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
#import <Foundation/Foundation.h>

@interface NSString (Number)
//计算某个字符串中阿拉伯数字的个数的对象方法
- (int)numberCount;
//计算某个字符串中阿拉伯数字的个数的类方法
+ (int)numberCountOfString:(NSString *)str;
@end

@implementation NSString (Number)
//计算某个字符串中阿拉伯数字的个数的对象方法
- (int)numberCount
{
// 1.定义变量保存个数
int count = 0;

// 2.遍历字符串,NSString中自带方法length,求字符串长度
for (int i = 0; i < self.length; i++)
{
//取出对应为止的字符
unichar c = [self characterAtIndex:i];
if (c >= '0' && c <= '9')
{
count++;
}
}
return count;
}

//计算某个字符串中阿拉伯数字的个数的类方法
+ (int)numberCountOfString:(NSString *)str
{
return [str numberCount];
}
@end

int main()
{
NSString *s = @"itcast123456";

int count = [s numberCount];
NSLog(@"个数是%d", count);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: