·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> OC当中特有的语法

OC当中特有的语法

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

一、分类Category

1.什么是分类

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

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

2.分类的书写形式

>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_DEFINED
2 /// 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)initialize
14 {
15     NSLog(@"Cat + initialize");
16 }
17 
18 - (void)quickEat
19 {
20     NSLog(@"cat - eat");
21 }
22 
23 @end
24 // 输出结果
 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + load
 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + initialize