OC-030.分类(类别)

本文介绍了Objective-C中分类的概念及应用,详细说明了如何通过分类来扩展已有类的功能,包括增加新方法而不添加成员变量的过程,并展示了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分类(类别)作用:扩展已有类的功能
1、分类是原来的类增加方法-----仅仅增加方法而已
2、在方法内部可以访问原有类的成员变量(定义.h头文件中)

如何增加一个分类操作步骤:右键点击New File->Objective-C.File->第一行输入名称,第二行选择Category,第三行选择需要扩展的类名。

注意点:
1、分类中不能扩展原有类的成员变量
2、@property在分类中只能生成getter setter方法的声明,不能生成实现和成员变量
分类可以扩充系统自带的类的功能
给NSObject增加分类会影响到所有的类,但是这个东西一定要谨慎小心
3、你不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法
4、如果你再分类中增加一个原有类同名方法 ,那么分类中个方法会覆盖原有类的方法(哪怕你没有导入这个分类)

5、多个分类中如果有相同方法,优先使用最后编译到的分类方法。(在目标标签页选择Build phases下的compile sources查看编译顺序。)

#import <Foundation/Foundation.h>//------main
#import "LSPerson+show.h"//导入分类.h文件
#import "LSPerson.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        LSPerson *per = [[LSPerson alloc] init];
        per.name = @"龙叔叔";
        [per say];
        [per show];//可以使用分类的方法
    }
    return 0;
}
#import <Foundation/Foundation.h>//------LSPerson.h

@interface LSPerson : NSObject
{
    @private
    int _age;
}
@property(nonatomic,copy)NSString *name;
-(void) say;
@end
#import "LSPerson.h"//------LSPerson.m

@implementation LSPerson
-(void) say{
    NSLog(@"%s",__func__);
}
@end
#import "LSPerson.h"//------LSPerson+Show.h

@interface LSPerson (Show)
{
//    double _height;在分类中是不能增加成员变量的
}
//只能生成getter 与 setter方法的声明,不能生成方法的实现,更不会生成成员变量
//@property (nonatomic,assign) double height;

-(void) show;//增加一个show的方法

@end
#import "LSPerson+show.h"//------LSPerson+Show.m

@implementation LSPerson (Show)
-(void) show{
    //在分类的内部可以访问原有类的成员变量(不是定义在.m文件中的)
    //因为导入的头文件的私有成员变量事实上是在.m文件中,所以这边不能直接用_name;
    //如果导入的头文件的变量名在.h文件中,就可以_age访问
    _age = 28;
    NSLog(@"age = %d,name = %@",_age,self.name);
}
@end







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值