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

一、分类的基本使用
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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值