你的位置:首页 > 操作系统

[操作系统]OC当中特有的语法


一、分类Category

1.什么是分类

>分类:可以在不改变原有类前提的情况下,拓展很多新方法,但是不能拓展新的成员变量。

    如果想要扩展新的成员变量,可以考虑使用继承。

2.分类的书写xingshi

>1),分类头文件:

    @interface 原有类 (分类名称)

    // 方法声明

    @end

> 2),分类的实现文件:

    @implementation 原有类 (分类名称)

    // 分类声明中的方法的实现

    @end

3.使用注意

分类使用注意:

      1),在分类中不能访问原始类primary中@private作用域的成员变量

      2),如果分类实现了和原始类同名的方法,会覆盖原始类的这个方法,是的原始类的这个方法无法被调用

      3),如果多个分类都实现了和原始类同名的方法,那么会优先调用分类的这个方法,而且是最后参加编译的那个优先级更高。

          (也就是:分类(最后参与编译的优先)-->原始类-->原始类的父类)

            所以,最好不好在分类中实现和原始类同名的方法

4.分类的好处

     1), 可以将一个很大的项目分模块进行开发,减小项目的复杂性。

     2),很多的功能被分散到不同的类中,由团队不同成员开发,增强团队合作性。

5.相关的操作

  1)在Xcode 6.3版本中可以用快捷键 command + N 选择OS X下面的Objective-C File 建立相对应类的分类,进入项目中,不喜欢使用快捷键的可以按照File-->NEW-->File..来选择相应的文件操作。

  2)建立的分类的声明和实现形如:

// 分类的声明

#import "Father.h"@interface Father (Work)//{//  int age; // 分类不能扩充成员变量//}- (void)work;//- (void)walk;@end

// 分类的实现

#import "Father+Work.h"@implementation Father (Work)//原始类+分类名字- (void)work{//  NSLog(@"名字是%@的father在工作", _name); // 在分类中不能直接访问原有类中@private作用域的成员变量  NSLog(@"名字是%@的father在工作", self.name);}- (void)walk{  NSLog(@"名字是%@的father+work在走路", self.name);}@end

 

二、类的本质

1. 类也是个对象

> 其实类也是一个对象,是Class类型的对象,可以简称为“类对象”

  在Xcode中按住command键鼠标放在class点进去会发现原来class真正的面貌:

1 #if !OBJC_TYPES_DEFINED2 /// An opaque type that represents an Objective-C class.3 typedef struct objc_class *Class;4 5 /// Represents an instance of a class.6 struct objc_object {7   Class isa OBJC_ISA_AVAILABILITY;8 };

  上述是Class类型的定义。

>类名就代表着类对象,每个类只有一个类对象。

>相关配图

2.+load 和 +initialize

>  +load

  在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法

  先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load

  先加载元原始类,再加载分类

  不管程序运行过程有没有用到这个类,都会调用+load加载

>  +initialize

   在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法

   一个类只会调用一次+initialize方法,先调用父类的,再调用子类的

  定义了一个Animal类,并让Cat继承于Animal用于演示 +load 和 +initialize

 1 #import "Animal.h" 2  3 @interface Cat : Animal 4 - (void)quickEat; 5 @end 6  7 @implementation Cat 8 + (void)load 9 {10   NSLog(@"Cat + load");11 }12 13 + (void)initialize14 {15   NSLog(@"Cat + initialize");16 }17 18 - (void)quickEat19 {20   NSLog(@"cat - eat");21 }22 23 @end24 // 输出结果 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + load 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + initialize