objective c 类目 延展 协议

本文介绍了Objective-C中的类目(Category)与延展(Extension)的概念及使用方法,包括它们的区别与应用场景,以及如何通过类目扩展类的功能而不修改原始类。

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

类目(Category)又叫类别:为封装类添加额外的方法,对现有类扩展

类目定义的方法会成为原始类的一部分,子类可以继承已经添加类目的父类的所有方法,但父类不能拥有子类的类目方法,类目不继承原始类,只兼容和扩展原始类

无法向类目中添加新的成员变量,只能通过继承添加;如果在类目中覆盖现有类方法,会引起super 消息的断裂,不能再访问原来类中同名的方法,因为类目方法更高的优先级,因此一般不要覆盖现有类方法

 

<span style="font-size:14px;">@interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意
-(void)invert;//方法
@end

//实现部分

#import "NSMutableArray+Sort.h"
@implementation NSMutableArray (Sort)
-(void)invert
{
  //执行代码
}
@end

//如何使用
//在主函数里边可以直接调用上边的invert方法

 NSMutableArray * arr = [[NSMutableArray alloc]initWithObjects:@"12",@"4",@"89",@"88",@"36", nil];    
 [arr invert];    </span>
Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
 
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。


延展(Extension)“匿名”的类目,延展定义类的私有方法,一般是在类的实现文件@implementation之上定义如:Person() 和类目的区别在于括号里面是空的,没有名字的,暂时性的存在,只能本类调用方法,子类也无法调用父类的延展

<span style="font-size:14px;">#import "Student.h"
@interface Student ()//为Student类创建一个私有的方法text
-(void)text;
@end

@implementation Student
-(void)hello;
{
    [self  text];
}

-(void)text
{
    NSLog(@"你好");
}
@end
</span>

外界  [student hello]的时候就会打印出“你好”。但是在外界不能调用text方法,[student text]是不对的。只能在.m文件里边通过self来调用私有方法text。隐藏了内部的实现。

另外在本类的实现文件@implementation之上也可以定义私有方法,私有的静态变量

延展的特点就是定义私有方法

 OC中并没有像Java或者其他语言中提供的私有方法,OC中的私有,可以理解
为相对私有。
OC中私有方法实现有两种方式:
1)方法在.m中实现,不在.h中声明(相对私有)
2)通过匿名类别(延展)实现私有(一般意义上的私有)
@interface MyClass {
// 添加变量
}
-(void)PublicMethod;//公共方法,可以被继承类继承
@end
而在类的.m文件中,采用类别来实现私有方法,具体操作为:
@interface MyClass()//注意(),即定义一个空类别
-(void)PrivateMethod;//在类别中定义私有方法
@end

协议
可以用来声明一大堆方法(不能声明成员变量)
只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
只要父类遵守了某个协议,就相当于子类也遵守了

协议的编写:
<span style="font-size:14px;">@protocol 协议名称
// 方法声明列表
@end 
</span>

某个类遵守协议:
<span style="font-size:14px;">@interface 类名 : 父类 <协议名称>
@end 
</span>

关键字

@required :必须实现。默认

@optional :选择性的实现

NSObject为基本类根类也为基协议,可以写也可以不写

 协议的声明

在类的起始处使用 @protocol 协议名;(类似于@class)


代理设计模式:

即本身不做实际的事情,而要求其他人去做
例如要卖房子,不是直接销售,二十让中介去帮自己销售
中介就是我们的代理

就是说该对象类有委托方法,实现委托方法(遵守委托协议)需要在其他类中实现,通过其他类对象来代理解决


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值