[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
[New learn]@class和#import的区别使用的更多相关文章
- python中import和from...import...的区别
python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...
- 【转载】link和@import的区别
link和@import的区别 原文地址:http://www.cnblogs.com/zbo/archive/2010/11/17/1879590.html 页面中使用CSS的方式主要有3种:行内添 ...
- Objective-C 【关于导入类(@class 和 #import的区别)】
之前我们分析过 #include 和 #import 的区别,#import不会引起交叉编译,#import 确定一个文件只能被导入一次,使在递归包含中不会出现问题. 那么 #import 和 @cl ...
- 引入CSS文件的方式,以及link与@import的区别
一.引入css的方式 在HTML中引入css的方法主要有4种:行内式.内嵌式.链接式和导入式. 1.行内式 <div style="background:yellow;"&g ...
- 页面引入css用link和import的区别
假设有一个css文件a.css,文件里的内容如下: p { font-size: 18px; } 现在分别使用两种方式引入a.css: 1.使用html的link标签 <link rel=&qu ...
- 1ink 与 @import 的区别
1ink与@import的区别 目录 1ink与@import的区别 差别1:归属关系的差别 差别2:加载顺序的差别 差别3:兼容性的差别 差别4:使用dom控制样式时的差别 1ink与@import ...
- import 与 from…import 的区别
首先你要了解 import 与 from…import 的区别. import 模块:导入一个模块:注:相当于导入的是一个文件夹,是个相对路径. from…import:导入了一个模块中的一个函数:注 ...
- 由link和@import的区别引发的CSS渲染杂谈
我们都知道,外部引入 CSS 有2种方式,link标签和@import. 它们有何本质区别,有何使用建议,在考察外部引入 CSS 这部分内容时,经常被提起. 如今,很多学者本着知其然不欲知其所以然的学 ...
- import与from...import...的区别
from ... import ... 的用法和直接import的区别: 1.直接使用import时,如果需要使用到导入模块内的属性和方法,必须使用模块名.属性和模块名.方法的方式进行调用 2.使用f ...
随机推荐
- 【题解】洛谷P3709大爷的字符串题
最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...
- [洛谷P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目大意:给你一张有向图,每个点最多一条出边,问从每个开始,走多少步会到一个已经过的点 题解:$tarjan$缩点,然后建反图$DP$ 卡点:无 C++ Code: #include <cstd ...
- [CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...
- jsp电子商务购物车之五 数据库存储篇2
业务逻辑图,简单版要写各个Servlet //ChangeCartCountServlet 使用ajax实现数量,增加或减少; package com.cart.web; import java.io ...
- AppWidget学习总结
AppWidget学习总结 一.创建AppWidget. 1.在res/xml下创建一个xml文件,以设置widget占用的空间等信息.如widget_provider.xml & ...
- [nginx]代理404跳转
1.nginx作为反向代理,如果代理请求的页面不存在,返回404,但是浏览器中一片空白. 要求:将404跳转到指定页面. 在server段添加: error_page 404 /; 不能生效,原因是需 ...
- POJ 2391 二分+最大流
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19066 Accepted: 4 ...
- 再续前缘-apache.commons.beanutils的补充
title: 再续前缘-apache.commons.beanutils的补充 toc: true date: 2016-05-32 02:29:32 categories: 实在技巧 tags: 插 ...
- 关于jmf不能播放mp3的问题解决
想写个JAVA的MP3音乐管理器,使用JMF插件,但发现运行时总报一个异常: Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Ster ...
- ZooKeeper观察者(十三)
观察者:扩展ZooKeeper而不影响写性能 尽管ZK运行地很好通过客户端直接连接来投票集群的成员,这个结构使它很难扩展出很多客户端.问题是当我们加入更多的投票成员时,写性能就会下降.这是因为一个写操 ...