Category注意事项
阅读原文时间:2023年07月08日阅读:2
  • 分类只能增加方法, 不能增加成员变量

@interface Person (NJ)
{
// 错误写法
// int _age;
}

  • (void)eat;
    @end

  • 分类中写property只会生成方法声明

@interface Person (NJ)
// 只会生成getter/setter方法的声明, 不会生成实现和私有成员变量
@property (nonatomic, assign) int age;
@end

  • 分类可以访问原来类中.h中的成员变量

@interface Person : NSObject
{
int _no;
}
@end

@implementation Person (NJ)

  • (void)say
    {
    NSLog(@"%s", __func__);
    // 可以访问原有类中得成员变量
    NSLog(@"no = %i", _no);
    }
    @end

  • 如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略

@implementation Person

  • (void)sleep
    {
    NSLog(@"%s", __func__);
    }
    @end

@implementation Person (NJ)

  • (void)sleep
    {
    NSLog(@"%s", __func__);
    }
    @end

int main(int argc, const char * argv[]) {
Person *p = [[Person alloc] init];
[p sleep];
return 0;
}

输出结果:
-[Person(NJ) sleep]

  • 多个分类中有同名方法,则执行最后编译的文件方法(注意开发中千万不要这么干)

@implementation Person

  • (void)sleep
    {
    NSLog(@"%s", __func__);
    }
    @end

@implementation Person (NJ)

  • (void)sleep
    {
    NSLog(@"%s", __func__);
    }
    @end

@implementation Person (MJ)

  • (void)sleep
    {
    NSLog(@"%s", __func__);
    }
    @end

int main(int argc, const char * argv[]) {
Person *p = [[Person alloc] init];
[p sleep];
return 0;
}

输出结果:
-[Person(MJ) sleep]

方法调用的优先级(从高到低)

  • 分类(最后参与编译的分类优先)
  • 原来类
  • 父类

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章