博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发21-OC学习- #include、#import和@class,解决#import死循环
阅读量:3531 次
发布时间:2019-05-20

本文共 1691 字,大约阅读时间需要 5 分钟。

 #include、#import和@class,解决#import死循环

1、#include

#include < >:引用系统文件,它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件。

 # include "  ":用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录下查找,最后在系统文件中查找。

在使用#include的时候要注意处理重复引用 :

类A 与 类B同时引用了类C,不做重复引用处理的时候在类D中同时引用类A,类B的话,编译会提示对类C重复引用的错误.         

#ifndef _CLASSC_H//一般是文件名的大写,classC.h          
#define _CLASSC_H    
                   
#include "ClassC.h"     
                 
#endif      
分析:

当第一次包含ClassC.h时,由于没有定义_CLASSC_H,条件为真,这样就会包含(执行)#ifndef _CLASSC_H和 #endif之间的代码;

当第二次包含ClassC.h时,前面一次已经定义了_CLASSC_H,条件为假,#ifndef _CLASSC_H和 #endif之间的代码也就不会再次被包含,这样就避免了重定义了。

2、#import

在代码中使用两次#include同一个.h文件的时候会报错:#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误。

使用两次#import同一个.h文件的话,不会报错,因为#import会做一次判断,如果已经导入过一次这个.h文件就不会再次导入这个文件了。

#import 是oc导入头文件的关键字,#include是c/c++导入头文件的关键字,#import不会重复导入,不会引起交叉编译。

#import < >:引用系统文件,它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件。
 # import "  ":用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,如果找不到就到到安装目录中查找。

3、@class解决#import死循环

头文件循环引用:

定义两个类,A和B

A.h

#import 
#import "B.h"@interface A : NSObject@property(nonatomic,strong)B *b1;@end

A.m

#import "A.h"@implementation A@end

B.h

#import 
#import "A.h"@interface B : NSObject@property(nonatomic,strong)A *a1;@end

B.m

#import "B.h"@implementation B@end
此时就会造成循环引用头文件的错误:

此时使用@class可以避免这个错误

改成如下:

A.h

#import 
@class B;@interface A : NSObject@property(nonatomic,strong)B *b1;@end

A.m

#import "A.h"#import "B.h"@implementation A@end

B.h

#import 
@class A;@interface B : NSObject@property(nonatomic,strong)A *a1;@end

B.m

#import "B.h"#import "A.h"@implementation B@end

#import 把头文件包含进来仅且一次,而@class不用,@class编译效率比#import 更高。

在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。

著作权声明:本文由http://my.csdn.net/Nathan1987_原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢
你可能感兴趣的文章
数据结构之栈
查看>>
小镇做题家|在 O(1)的时间内找到栈的最值
查看>>
数据结构之队列
查看>>
Kafka 学习笔记(一)
查看>>
小明同学的实习生活(前言)
查看>>
小明的实习生活(一)
查看>>
小明的实习生活(二)
查看>>
CentOS系统的使用以及相应环境的搭建(一)
查看>>
小明的实习生活(三)
查看>>
使用CentOS镜像制作本地yum
查看>>
小明的实习生活(四)
查看>>
程序员必会——如何解决电脑连接不上github网站
查看>>
Windows环境下Oracle监听日志文件大于4G,导致程序连接超时。
查看>>
ArrayList源码解析
查看>>
不通过服务器,使用GitHub搭建一个静态的个人网站。
查看>>
Spingboot项目启动,游览器自动打开项目。
查看>>
SpingBoot系列教程(一):整合Mybatis-plus+Druid
查看>>
基于GitHub搭建一个静态简历模板
查看>>
SpingBoot系列教程(二):SpringBoot+Logback
查看>>
SpingBoot系列教程(三):SpringBoot配置全局异常/自定义异常
查看>>