当前位置: 代码迷 >> 综合 >> OC协议(Protocol)、分类(Category)和类扩展的简单使用
  详细解决方案

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

热度:43   发布时间:2024-02-02 00:03:18.0

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()
{@publicint _height;
}
-(void)run;@end

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

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

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

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

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

  4. 总结

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

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

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

4??分类与类扩展的区别

-分类中只能增加方法 

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

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

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

  相关解决方案