#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 ...
随机推荐
- pl/sql查询中文乱码
1.设置系统环境变量 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 2.修改注册表 regedit->hkey_local_machine ...
- 畅通project(杭电1863)
畅通project Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- SQL Server 2012 Enterprise Edition安装过程详解(包含每一步设置的含义)
一.启动安装程序,点击“安装”选项卡,选择“全新SQL Server独立安装或向现有安装添加功能”.(首次安装数据库系统或向现有数据库系统添加功能,均选择此选项) 二.随后,安装程序进行“安装程序支持 ...
- VC com 通信实例
HANDLE hCom;//全局變量串口句柄 COMMTIMEOUTS TimeOuts; DCB dcb; 按鈕代碼() { hCom=CreateFile(L“COM1”,// 串口名稱 GENE ...
- Ubuntu 12.04 下安装git
---恢复内容开始--- 1.安装build-essential. 列出Git相关包(git-core 和 git-doc)所以来的各个安装包并安装: sudo apt-get build-dep g ...
- jQuery 动态绑定的点击事件
$(function () { , $_div = $('#test'); $('input[name=addbtn]').on('click', function () { $_div.append ...
- phpcms v9 万能字段使用
<input type="text" name="info[down]" id="down" value="{FIELD_V ...
- Springmvc加载静态文件和开启EL表达式的支持
一.静态文件加载问题 刚开始学习SpringMVC,发现静态文件无法加载 web.xml配置如下: <web-app id="WebApp_ID" version=" ...
- TableViewController的添加,删除,移动
#import "RootTableViewController.h" @interface RootTableViewController () { UITableViewCel ...
- solaris11.2下编译QT-配置命令
1.make 版本为:GNU Make 3.82 2.gcc版本是:3.4.3(pkg install ...) 2.直接./configue是不行的 解决:./configue -platform ...