[New learn]@class和#import的区别使用
1.简介
我们在查看代码的时候经常会发现有些地方使用@class而有些地方使用#import,他们到底有什么区别呢,
本文意图去归纳和总结这两种类引用的是的处理方法和规则。
2.分析
此小节会通过一些实例代码来讲解这中引用头文件方式的区别所在。
1.首先我们新建一个Single View Application的工程,在此工程中增加一个继承自NSObject的XFPerson类。
2.观察如下代码的错误原因:
在ViewController.m中声明一个XFPerson变量。
虽然XFPerson的相关文件在工程中,但是要想在其他类中引用这个类则必须将这个类的信息告知当前类,换句话数要让当前类知道要引用的类的基本信息。
我们可以使用两种去处理,可以直接使用@class标签或者使用#import去包含引用类的头文件。
这两种方法都为当前提供了引用类的相关信息,但是信息的详细程度是不一样的。
3.直接使用@class
首先来讨论一下@class标签,其实它提供的信息是最少的,可以说它只是告诉当前类当前类”你所引用的类是存在的,就是叫这个名字,他能做什么我就不知道了“,有时候我们也将@class称之为
预申明。基于这一点我们将ViewController.m中改变如下,通过@class引入XFPerson类信息:
我们可以看到通过这个方式,当前类已经放心的去声明引用类变量了。
但是当我们继续去创建XFPerson对象的时候发现如下错误:
xcode所提示的错误已经很
清楚,XFPerson对于当前类来说只是“forward declaration”预声明,当前类因为@class提供的信息只相信了XFPerson确实存在了,由于
信息太少,根本就不知道这个类中有什么样的方法,也就是他能够做些什么?所以当我们试图去调用XFPerson的一些方法的时候就会出错。
就这个时候就需要#import出手了!
4.使用#import 引用类的头文件
当将@class替换为#import后,编译正常:
5.基类头文件的引用
打开XFPerson.h文件,你会看到xcode自动的帮我们引用了系统的一些头文件:
原因在于我们的类继承自NSObject,那么我们就必须将NSObject这个父类的有文件#import方式引入到子类的头文件中。
关于这一点我们可以以下例子来解释:
我们新创建一个类名为:XFAnimal,它同样继承自NSObject
然后我们将XFPerson的父类换成XFAnimal:
我们看到编译器并不知道XFAnimal的信息,那么我们使用@class标示是否可行呢?
依然报错,错误的原因也很清楚。
接着我们使用#import来引入XFAnimal头文件:
一切正常了。
3.总结
我们可以看到#import既可以在.h也可以在.m中使用,那么我们到底应该如何判断呢?
一般只要记住:
1.如果子类集成父类,那么需要将父类的头文件#import到子类的头文件中。
2.如果在.m文件中引用了某个类,则需要将这个类的头文件#import到.m文件中。
那么在上述分析过程中发现#import与@class相比,提供的信息更加丰富,为什么不直接使用#import呢?
我们在苹果官方文档中看到:
The @class directive minimizes the amount of code seen by the compiler and linker, and is there fore the simplest way to give a forward declaration of a class name. Being simple, it avoids potential problems that may come with importing files that import still other files.
所以最终归纳为:
可以使用@class的地方一定要使用@class,必须使用#import的时候才去使用#import
最新文章
- 在Window 下安装Redis数据库
- C#自学系列 - 开篇
- MVC增删查改,从数据库到后台,到前端,整个复习一下
- [转载] poll()函数
- 问题.NET--win7 IIS唯一密钥属性“VALUE”设置为“DEFAULT.ASPX”时,无法添加类型为“add”的重复集合
- AspNetPager
- pytesser图片文本识别
- Mybatis 数据库物理分页插件 PageHelper
- hdoj 2674 N!
- Varnsih调用多台后端主机
- ArcGIS 网络分析[8.6] 资料6 创建网络分析图层及进行路径分析
- Spring学习笔记(1)
- doc命令大全(详细版)
- 【LeetCode】108. Convert Sorted Array to Binary Search Tree
- 第七周学习总结-C#
- Python os.walk() 方法遍历文件目录
- 权限控制框架---shiro入门
- Best Practice AngularJS
- delphi RTTI 三 属性读取与赋值
- 基于.NET Standard的分布式自增ID算法--Snowflake
热门文章
- hadoop 编码实现文件传输、查看等基本文件控制
- 【题解】Atcoder ARC#90 F-Number of Digits
- BZOJ1101 &; 洛谷3455:[POI2007]ZAP——题解
- HDOJ(HDU).1016 Prime Ring Problem (DFS)
- MEMCACHE用法详解
- 【状压DP】【P2831】【NOIP2016D2T3】愤怒的小鸟
- JQuery选择符的理解与应用
- PostgreSQL主键索引膨胀的重建方法
- HDU1166:敌兵布阵(线段树模板)
- mysql绿色版安装,多实例安装