zoukankan      html  css  js  c++  java
  • #include、#import与@class的使用与头文件循环引用问题

    #include

    • #include <>:一般是对系统库文件的引用,编译器会去系统文件文件夹下查找。
    • #include “xxx.h”:一般是对自己定义文件的引用,编译器首先会去用户文件夹下查找。然后再去安装文件夹查找,最后去系统文件文件夹查找。

    #import

    • #import的功能与#include几乎相同,可是能够解决头文件反复导入的问题,而#include会有反复导入头文件的问题。
      比方class文件A、B都引用了class C。假设class D引用了class A、B,这时候就会报反复引用的错误,由于相当于class D引用了两次class C。所以在Objective-C中我们是常常使用#import。

    @class

    • 这个又什么时候会使用呢?常常是用来解决头文件循环引用的问题。由于#import “xxx.h” 是相当于把头文件拷贝到还有一个头文件。在某些情况下,比方:
        class A.h使用了#import "B.h"
        class B.h使用了#import "A.h"

    循环引用问题:

    那么这就会导致了头文件循环引用的问题了,通常都是出现尽管你导入了该头文件,但在使用时比方使用@propery(nonatomic)A *a;会出现:
    Unknown Type 之类错误. 所以这个时候@class就派上用场了。

    解决方式:

    在class A中不用做改变。在class B.h中使用@class A替换#import "A.h"。@class的作用仅仅是跟头文件说明有这个文件,你能够定义这个类型的属性,然后我们在实现B.m文件再使用#import "A.h"就可以使用class A中定义的全部函数与属性。这就攻克了循环引用的问题。

    总结:

    非常多情况出现头文件循环引用的问题不是这样简单的情况,有时候会由于多重继承和多重引用而使情况显得非常复杂。比方:

      class A 继承 class B
    ->class B 继承 class C
    ->class C 继承 class D
      class D 中#improt "F.h"
    ->class F 继承了 class E
      class E 中#improy "A.h"
      ...
    这时候class D与class E就出现了循环应用头文件的问题。但你说好吧这个简单。class D或者E中某一个使用个@class不就攻克了。

    假如让D使用@class。可是假设D须要使用到E的变量或者函数呢? 所以面对多重继承多重引用的时候我们一定要小心使用。

  • 相关阅读:
    安全测试全面总结3基于OWASPZAP进行接口安全测试
    wiki还是复利的思想,不断的更新迭代,需要学习并实践
    redis竟然还有哨兵模式,所以更加不能再扩展了,必须要在已有的基础上进行深挖!!!
    什么是SonarQube?
    安全测试全面总结1OWASP服务端安全测试体系
    jmeter全面总结4压测结果分析
    安全测试全面总结7 XSS漏洞
    jmeter全面总结5jmeter分布式
    jmeter全面总结1介绍和安装
    pytest的inifile文件配置
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7047309.html
Copyright © 2011-2022 走看看