#import和#include的区别 关键字@class的作用
当我们在代码中使用两次#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 
 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 
 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 
 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 
 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 
 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 
 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.   
#import和#include的区别 关键字@class的作用的更多相关文章
- iOS学习——@class和#import、#include的区别
		在iOS开发过程中,我们在一些源码中经常会看到导包的时候有的用#import进行导包,但是有的的时候也会看到用@class进行导包,那么这两种方式有什么区别呢? 一 @class和#import的主要 ... 
- iOS 之 #import与#include的区别及@class
		#import 相比#include不会引起交叉编译. @class一般用于头文件中需要声明该类的变量时用到 
- iOS 开发学习-import和include的区别
		//当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 //但是使用两次#import的话,不会报错,所以他可以解决重复导入的 ... 
- #import、#include以及@class的区别
		一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话 ... 
- 1.import和include区别  2.NSLog 和printf区别  3.创建对象做的事情  4. 类和对象方法比较  5 匿名对象优缺点  6. 封装  7.作用域范围  8.id和instancetype 9.自定义构造方法规范   10.nil和Nil及NULL、NSNull区别
		1.import和include的区别: import可以防止头文件的重复包含 2.NSLog 和printf的区别: 1,NSLog可以自动换行, 输出调试信息, printf不能. 2,NSLog ... 
- IOS开发之----#import、#include和@class的区别
		1. 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include. 2. #import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题.&l ... 
- #import、#include、#import<>和#import””的区别
		一.#import与#include #import不会引起交叉编译的问题.因为在Objective-C中会存在C/C++和Object-C混编的问题,如果用#include引入头文件,会导致交叉编译 ... 
- #import和#include区别
		#import与#include的类似,都是把其后面的文件拷贝到该指令所在的地方 #import可以自动防止重复导入 #import <> 用于包含系统文件 #import"&q ... 
- IOS学习笔记38--@class #import辨析 #include
		tyle="margin:20px 0px 0px; line-height:26px; font-family:Arial"> #include 区分 #i ... 
随机推荐
- OC基础13:数字、字符串和集合2
			"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ... 
- hdu1814 Peaceful Commission,2-sat
			题目大意:一国有n个党派.每一个党派在议会中都有2个代表,现要组建和平委员会,要从每一个党派在议会的代表中选出1人,一共n人组成和平委员会.已知有一些代表之间存在仇恨,也就是说他们不能同一时候被选为和 ... 
- Bootstrap 简洁、直观、强悍、移动设备优先的前端开发框架,让web开发更迅速、简单。
			http://v3.bootcss.com/ 从2.x升级到3.0版本 Bootstrap 3并不向后兼容Bootstrap v2.x.下面章节列出的内容可以作为从v2.x升级到v3.0的通用指南.如 ... 
- Office 2010 & SharePoint 2010 Service Pack 2现在可用啦
			Access 2010 Runtime SP2 KB2687444 32-bit 64-bit Duet Enterprise for Microsoft SharePoint and SAP SP2 ... 
- 微信内移动前端开发抓包调试工具fiddler使用教程
			在朋友圈看到一款疯转的H5小游戏,想要copy,什么?只能在微信里打开?小样,图样图森破,限制了oauth.微信浏览器内打开,照样能看你源码~ 使用fiddler来抓包 需要先做一些简单的准备工作: ... 
- How debuggers work
			做了一个PPT用来和组内的同学交流一下.内容很简单,写得也很简单. 谁知道博客园文章里怎么直接嵌入PPT呢? link: http://www.slideshare.net/ssuserdc412f/ ... 
- Bostonkey Simple calc
			Simple Calc 明显的memcpy栈溢出,是一个静态链接的程序所以没给libc.发现里面有: 参数a1应该为_libc_stack_end的地址了._stack_prot通过rop修改为0x7 ... 
- C# 利用反射动态调用类成员
			用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): publicobject InvokeMember( string name, ... 
- UVA 1395 Slim Span
			题意: 要求的是所有生成树中最大边与最小边差值最小的那个. 分析: 其实可以利用最小瓶颈生成树,就是最小生成树这一性质,枚举原图的最小边,然后找相应生成树的最大边 代码: #include <i ... 
- 回滚Swtichover
			从11.2.0.2开始,如果由于某种原因switchover没有成功,可以回滚switchover. For physical standby databases in situations wher ... 
