【OC语法】#import和#include的区别

转载 2015年11月17日 16:30:26

一、#import和#include的区别

当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误

但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了


二、关键字@class的作用

在来看一下OC中的关键字@class的作用,在看他的作用之前,先来看一个问题:

现在有一个课程类Classes和学生类Student,他们两之间需要相互引用(导入)。直接看代码比较直接:

Classes.h

[objc] view plaincopy
  1. //  
  2. //  Classes.h  
  3. //  08_@class  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. #import "Student.h"  
  12.   
  13. //不会将Student.h拷贝过来,只是告诉编译器Student这个类在别的地方中有定义,这样就不知道这个类中任何信息(哪些属性和方法)  
  14. //@class Student;  
  15.   
  16. @interface Classes : NSObject{  
  17.       
  18. @public  
  19.     Student *_student;  
  20. }  
  21.   
  22. - (void)t1;  
  23.   
  24. @end  

导入Student.h头文件


Classes.m

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Classes.m  
  3. //  08_@class  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Classes.h"  
  10.   
  11. //#import "Student.h"  
  12.   
  13. @implementation Classes  
  14.   
  15. - (void)t1{  
  16.     [_student work];  
  17. }  
  18.   
  19. @end  


在来看一下Student类

Student.h

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //  Student.h  
  2. //  08_@class  
  3. //  
  4. //  Created by jiangwei on 14-10-11.  
  5. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  6. //  
  7.   
  8. #import <Foundation/Foundation.h>  
  9.   
  10. #import "Classes.h"  
  11.   
  12. @interface Student : NSObject{  
  13.     Classes *_classes;  
  14. }  
  15.   
  16. - (void)work;  
  17.   
  18. @end  
同样的也导入Classes.h头文件


Student.m

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Student.m  
  3. //  08_@class  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Student.h"  
  10.   
  11. @implementation Student  
  12.   
  13. - (void)work{  
  14.     NSLog(@"work");  
  15. }  
  16.   
  17. @end  


在来看一下测试代码:

main.m

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  main.m  
  3. //  08_@class  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. #import "Classes.h"  
  12. #import "Student.h"  
  13.   
  14. //Classes和Student相互导入会出现问题  
  15. //这时候我们就可以使用@class解决这样的问题  
  16. //我们一般在.h文件中使用@class,因为在.h文件中一般是不会使用类的属性和方法的  
  17. //在.m文件中可以导入.h文件  
  18. int main(int argc, const charchar * argv[]) {  
  19.     @autoreleasepool {  
  20.         Classes *cls =[[Classes alloc] init];  
  21.         Student *stu = [[Student alloc] init];  
  22.         cls->_student = stu;  
  23.         [cls t1];  
  24.           
  25.     }  
  26.     return 0;  
  27. }  
这里有一个问题注意一下:我们看到了这里是如何使用Classes中的属性_student的,因为在Classes类中属性_student是@public的,所以可以直接使用,用的是箭头符号,和C/C++中的指针变量调用差不多。记住了,这里就说到了如何直接访问一个类中的@public修饰符的属性变量


我们编译运行:

看到了,编译错误,说在Student类中的Classes类找不到指定类型,这就奇怪了,我们不是导入了Classes.h文件了,为什么还是找不到类型呢?

这就是OC中类的相互引用的问题,我们在Student.h文件中导入了Classes.h,又在Classes.h文件中导入了Student.h,OC中在相互导入的时候编译是不通过的

这样就会导致错误。

当然解决办法就是使用@class关键字,我们修改一下Classes类

Classes.h

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Classes.h  
  3. //  08_@class  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. //#import "Student.h"  
  12.   
  13. //不会将Student.h拷贝过来,只是告诉编译器Student这个类在别的地方中有定义,这样就不知道这个类中任何信息(哪些属性和方法)  
  14. @class Student;  
  15.   
  16. @interface Classes : NSObject{  
  17.       
  18. @public  
  19.     Student *_student;  
  20. }  
  21.   
  22. - (void)t1;  
  23.   
  24. @end  
我们将#import "Student.h"代码注释了,使用

@class Student

这段代码的作用就是不会将Student.h文件拷贝过来,只是告诉编译器Student这个类在别的地方中有定义,这样就不知道这个类中的任何信息了(哪些属性和方法)

Classes.m

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Classes.m  
  3. //  08_@class  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Classes.h"  
  10.   
  11. #import "Student.h"  
  12.   
  13. @implementation Classes  
  14.   
  15. - (void)t1{  
  16.     [_student work];  
  17. }  
  18.   
  19. @end  
然后在Classes.m文件中导入#import "Student.h"文件,这时候编译就不会报错了,同样就可以正常的运行了:



总结

这一篇文章就介绍了#import关键字和@class的作用,特别是@class关键字的使用,为了解决相互导入的问题,在此回顾一下我们是怎么操作的:

Student类中的导入Classes.h方式不变,在Classes.h头文件中使用@class关键字引入Student类型,使其编译通过,然后在Classes.m文件中导入Student.h文件,使其运行通过。

以后遇到这样的问题解决方法就是这样操作的。

Objective-C(一、文件扩展名,驼峰标识法,#import与#include,OC弱语法)——iOS开发基础

OC发展概述,文件扩展名,命名规范:驼峰标识法,#import与#include的区别,OC常用数据类型,nil与Nil区别,OC程序编译连接运行过程,OC弱语法等等...

OC笔记15,16(#import#include的区别) 2.1(封装的概念)2.2(继承的概念)

笔记15是一个练习,一个类创建另两个类的对象,并调用另两个类的方法。 视频16: #inport和#inclide的区别: 讲区别就先要清楚他们两个有什么功能 在OC语言里面#...
  • v7595v
  • v7595v
  • 2015年05月29日 16:25
  • 368

小糖出品:oc中#import和#include之间的区别

大家好!小糖又回来了()。              今天给大家讲讲oc中#import和#include之间的区别。              之前接触过c语言的人一定对 #include 这条...

OC学习篇之---@class关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇...

OC学习篇之---@class关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇...

OC学习日记Day2:#include、#import和@class的工作原理

Objective-C学习日记——Day2 呆萌萌的@include 我们在用#include导入头文件时,头文件里一般都会加上以下代码 #ifndef __XIXI_H #define __XIX...

小程序中引用import和include区别

小程序中有两种引用方式一种是直接引用include,通过它相当于把标注的以外的代码全部copy过来当前位置,而import则是相反,它是只引用模板 import方式 这是index.wxml中的代码...

java import、package作用与用法以及与C include的区别

java import、package作用与用法 有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 impo...

FreeMarker中<#include>和<#import>标签的区别

在使用freemarker作为前端页面模板的应用中,会有很多的freemarker模板页面,这些ftl会在不同的页面中重复使用,一是为了简化布局的管理,二是可以重复使用一些代码。 在freemarke...

iOS #include与#import的区别

#include  #import  @class   讲解   #include 区分 #include 与#include "x.h"的作用 #include :它用于对系统自...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OC语法】#import和#include的区别
举报原因:
原因补充:

(最多只允许输入30个字)