OC协议(Protocol)、分类(Category)和类扩展的简单使用

1⃣️ 协议Protocol

  1. 创建自己的协议
    //定义MyPerson协议,NSObject是基协议
    @protocol MyPerson<NSObject>
    
    //@required修饰的方式是必须实现的,没有实现就会出现警告
    @required
    -(void)test;
    -(void)test1;
    
    //@optional不要求实现
    @optional
    -(void)test2;
    
    @end

     

  2. 遵循协议

-只要遵循一个协议,就拥有了该协议的所有方法

-允许遵循多个协议<1,2>。不可以多继承,但可以遵循多个协议

     3. 子类继承父类,子类也遵循父类遵循的协议,也拥有该协议的所有方法

     4.一个协议遵循另外一个协议,该协议也会拥有另外一个协议的所有方法         

@protocol MyProtocol2 <MyProtocol>

@end

     5. 不能在协议中定义成员变量,只能用来声明方法

     6. 当协议只给单个类遵守则可以放在类的.m文件中,若协议有多个类遵守就单独建文件声明协议

     7. 与@class一样可以在.h文件中声明,在.m中使用他们的方法

//.h
@protocol MyProtocol
@protocol MyProtocol2

//.m
#import "MyProtocol.h"
#import "MyProtocol2.h"

2⃣️分类的使用

  1. 给一个类创建一个分类 Person+eat.h

#import "Person.h"

@interface Person(eat)
{
    //分类中不能定义成员变量
}
//分类中也不建议写属性@property
-(void)eatFish;

@end

  2. 实现eatfish: Person+eat.m

#import "Person+eat.h"

@implemention Person(eat)

-(void)eatFish{
    _age = 10;
    NSLog(@"我吃了%d条鱼!",_age);
}

  3. 分类只能访问@protected和@public修饰的成员变量

  4. 当本类和分类中有相同的方法时,优先调用分类中的方法

  5. 分类和子类一样,都不能访问本类中的@private成员变量

  6. 子类可以调用父类中分类的方法

3⃣️类扩展的使用

正常类的声明格式:@interface 类名 :NSObject

分类格式:@interface 类名(分类名)

类扩展:@interface 类名()

  1. 创建一个类扩展

#import "Person.h"

@interface Person()
{
    @public
    int _height;
}
-(void)run;

@end

  2. run方法可以访问本类中所有的成员变量

  3. 类扩展实现真正的私有(在.m文件中创建类扩展)

  -类扩展声明的方法必须实现

  -子类无法通过任何方式访问父类中类扩展的方法和成员变量

  -使用@property修饰的成员变量外界仍然无法访问

  4. 总结

  -子类不能访问父类类扩展中的成员变量

  -子类不能访问父类类扩展中的方法

  -子类不能访问父类类扩展中用@property修饰的成员变量

4⃣️分类与类扩展的区别

-分类中只能增加方法 

-类扩展不仅可以增加方法,还可以增加成员变量,只是该成员变量是私有的,作用范围只在自身类,而不再子类或者其他类。 

-类扩展不能像分类那样拥有独立的部分(@implementation)也就是说,类扩展中声明的方法,必须依托对应的本类的.m文件来实现 

-定义在.m文件中的类扩展的成员变量和方法是私有的,定义在.h文件中的类扩展的成员变量和属性是公有的,类扩展是.m文件中声明私有方法非常好的方式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值