zoukankan      html  css  js  c++  java
  • OC当中特有的语法

    一、分类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
  • 相关阅读:
    【Linux】grep or
    win10查看WiFi密码
    【WPF】Border有显示模糊的情况
    【Spark】配置项spark.network.timeout 的单位是什么
    【Linux】free命令中 free与 available 的区别
    Spark2.3配置项
    java获取jar包执行路径
    编译 thrift-0.14.2 的 C++ 版本
    拉端保障方案
    编译运行ebpf代码的流水账
  • 原文地址:https://www.cnblogs.com/nqs674/p/4764375.html
Copyright © 2011-2022 走看看