[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

时间: 2024-12-15 15:58:59

[New learn]@class和#import的区别使用的相关文章

#import、#include、#import<>和#import””的区别

#import.#include.#import<>和#import””的区别 一.#import与#include #import不会引起交叉编译的问题.因为在Objective-C中会存在C/C++和Object-C混编的问题,如果用#include引入头文件,会导致交叉编译. 二.#import<>与#import"" 在实际运用中都是某个框架里的.#import <Three20/Three20.h><>通常指向的是一个目录#im

引入CSS文件的方式,以及link与@import的区别

一.引入css的方式 在HTML中引入css的方法主要有4种:行内式.内嵌式.链接式和导入式. 1.行内式 <div style="background:yellow;"></div> 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出CSS的优势,不推荐使用. 2.内嵌式 <html> <head> <style> ..// 此处添加css代码 </style> </head> <

iOS #include与#import的区别

#include  #import  @class   讲解  #include 区分 #include <x.h>与#include "x.h"的作用 #include <x.h>:它用于对系统自带的头文件的引用,编译器会在 系统文件目录下去查找该文件. #include "x.h":用户自定义的文件用双引号引用,编译器首先会 在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找. 在使用#include的时候要注意处理重复

(转载)OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性,今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了 二.关键字@class的作用 在来看一下OC中的关键字@class的作用,在

页面引入css用link和import的区别

假设有一个css文件a.css,文件里的内容如下: p { font-size: 18px; } 现在分别使用两种方式引入a.css: 1.使用html的link标签 <link rel="stylesheet" type="text/css" href="a.css"> 2.使用import <style type="text/css"> @import url(a.css); </style&

link 与 @import的区别

最近突然被问到link 与@import的区别,我只记得加载的顺序不同,在下来好好学习了一下后,总结我一下几点与各位共勉 1.首先加载的不同,link加载时异步加载,与页面同时加载,而@import会等到页面加载完成后才加载 2.可以引用的内容不同,link作为一个标签,不仅仅可以引入css文件,也可以引入其他定义RSS(RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用)等其他事务,而@inport只能引入css文件 3.lin

css 样式引入的方法 link 与import的区别

<link> 元素所参考的样式用户可以自由的选择加以改变,而导入的样式表单就自动的与剩下的样式表融合在一起了 CSS与HTML文档结合的4中方法:1 使用<link>元素链接到外部的样式文件2 在<head>元素中使用"style"元素来指定3 使用CSS "@import"标记来导入样式表单4 在<body>内部的元素中使用"style"属性来定义样式 1 用link进行引用 <link r

CSS中link和@import的区别

你对CSS中link和@import的区别是否熟悉,这里和大家分享一下,@import  属性用来指定导入的外部样式表及目标设备类型, link除了调用CSS外还可以有其他作用譬如声明页面链接属性,声明目录,rss等等,而@import就只能 调用CSS. CSS中link和@import有什么区别? 定义  ◆link元素 HTML和XHTML都有一个结构,它使网页作者可以增加于HTML文档相关的额外信息.这些额外资源可以是样式化信息(CSS).导航助手.属于另 外形式的信息(RSS).联系信

OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入