黑马程序员技术交流社区

标题: OC学习笔记之分类(Category)延展 [打印本页]

作者: chunhuayun    时间: 2015-10-10 08:09
标题: OC学习笔记之分类(Category)延展
1、类的延展的概念
延展类别又称为【扩展Extendsion】
是Category的一个特例
其名字为匿名(空)
例如
  1. @interface MyClass(){//扩展
  2. float value;
  3. }
复制代码

这种写法的类别叫做【匿名类别】,又叫类扩展,所谓的扩展,其实就是一个类添加额外的成员变量,方法或者合成属性

2、延展的实现
【可以在延展中,定义实例变量】
【不能使用@implementation 类名()去实现类别的方法,要直接写在类的实现中】
例如:
【Person.h文件内容】
  1. @interface Person : NSObject

  2. @end
复制代码

【Person_age.h文件内容】这个是延展头文件
  1. #import "Person.h"

  2. //分类扩展
  3. @interface Person(){
  4.     int _age;
  5. }
  6. @property(nonatomic,assign) int age;

  7. -(void)printAge;//放在
  8. @end
复制代码



【Person.m文件内容】
  1. #import "Person.h"
  2. #import "Person_age.h"
  3. int main(int argc, const char * argv[])
  4. {

  5.     @autoreleasepool {

  6.         Person *p = [Person new];
  7.         p.age = 22;
  8.         [p printAge];
  9.     }
  10.     return 0;
  11. }
复制代码



打印结果;
2015-10-07 11:44:17.014 分类扩展[923:303] age = 22

3、延展类可以定义私有方法
【在.m文件中使用延展】
例如:
  1. @interface Person(){

  2.     float _weight;//定义私有成员变量
  3. }
  4. @property(nonatomic,assign) float weight;
  5. //定义相对私有方法
  6. -(void)printWeight;
  7. @end

  8. @implementation Person
  9. //分类延展方法在原类的实现区实现
  10. -(void)printAge{
  11.     NSLog(@"age = %d",self.age);
  12. }

  13. //实现私有方法,该方法只能在该文件中使用
  14. -(void)printWeight{
  15.      NSLog(@"age = %.2f",self.weight);
  16. }
  17. @end
复制代码

4.类别与类扩展的区别
1)类别只能增加方法

2)类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例变量默认类型是私有的(作用范围只能在自身类,而不是子类或其他地方)

3)类扩展中声明的方法没有被实现,编译器会报警,但是【类别】中的方法没有被实现时编译器是不会有任何警告的,这是因为【类扩展】是在编译阶段被添加到类中的,而类别是在运行时添加到类中的

4)类扩展不能像类别那样拥有独立的【实现部分@implementation部分】,也就是说,【类扩展】所声明的方法必须依托对应类的实现部分来实现

5)定义在.m文件中的类扩展方法为私有的,定义在.h文件中的类扩展方法是共有的,【类扩展】是在.m文件中声明私有方法的非常好的方式






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2