OC之@class
2015-08-31 15:04
591 查看
假设有两个类,一个是Card,一个是Person,当Card中包含Person,我们就需要在Card前加上#import “Person.h“。如果此时Person中再包含Card的话,我们就又得在Person类前加上#import “Card.h”。这时再编译运行就会出现故障,因为编译运行会导致两个类不停得拷贝对方,导致报错。
这是可以在两个类前用:
@class 类
就可以避免这种问题,比如在Person中用@class Card;代替#import “Card.h”。在Card中用@class Person;代替#import “Person.h”。但是这样还是有一个问题,它仅仅告诉编译器某个名称是一个类,并没有把这个类中的所有东西拷贝过来。在实际开发中:
(1) 在.h文件中用@class来声明类
(2) 在.m文件中用#import来包含类的所有东西
@class和#import的区别(高频面试题):
对于循环依赖关系来说,比如A类引用B类,同时B类也引用A类:
这种代码会报错,当时用@class在两个类中互相声明,就不会编译报错。
(1)#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中B *b只是类的声明,具体这个类有什么信息,这里不需要知道,等实现文件中真正要用到时,才会去查看B类中信息。
(2)如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用这个文件的所有类都要重新编译一遍,这样对效率的影响也是可想而知的。相对来讲,使用@class方式就不会出现这种问题了。
(3)在.m实现文件中,如果需要引用到被引用类的尸体变量或者方法时,还需要使用#import方式引用被引用类。
这是可以在两个类前用:
@class 类
就可以避免这种问题,比如在Person中用@class Card;代替#import “Card.h”。在Card中用@class Person;代替#import “Person.h”。但是这样还是有一个问题,它仅仅告诉编译器某个名称是一个类,并没有把这个类中的所有东西拷贝过来。在实际开发中:
(1) 在.h文件中用@class来声明类
(2) 在.m文件中用#import来包含类的所有东西
@class和#import的区别(高频面试题):
对于循环依赖关系来说,比如A类引用B类,同时B类也引用A类:
这种代码会报错,当时用@class在两个类中互相声明,就不会编译报错。
(1)#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中B *b只是类的声明,具体这个类有什么信息,这里不需要知道,等实现文件中真正要用到时,才会去查看B类中信息。
(2)如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用这个文件的所有类都要重新编译一遍,这样对效率的影响也是可想而知的。相对来讲,使用@class方式就不会出现这种问题了。
(3)在.m实现文件中,如果需要引用到被引用类的尸体变量或者方法时,还需要使用#import方式引用被引用类。
相关文章推荐
- Android Native 绘图方法
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 深入了解PHP类Class的概念
- setAttribute 与 class冲突解决
- JavaScript中的类(Class)详细介绍
- javascript面向对象包装类Class封装类库剖析
- jQuery使用hide方法隐藏指定元素class样式用法实例
- jQuery给多个不同元素添加class样式的方法
- JavaScript更改class和id的方法
- 一篇入门的php Class 文章
- 深入C++中struct与class的区别分析