Objective-C 【关于导入类(@class 和 #import的区别)】

之前我们分析过 #include 和 #import 的区别,#import不会引起交叉编译,#import 确定一个文件只能被导入一次,使在递归包含中不会出现问题。

那么 #import 和 @class 又有什么区别呢?

(1)从实质上来说。

@class 和 #import 都是引入类的信息。

而不同的是 #import 会包含引入类的所有信息,包括实体变量和方法。

而 @class 一般是在头文件中使用的,因为他只告诉编译器,声明的类的名称,只是将这个类作为一个类型来用的(比如 Dog类的头文件中引入了 @class Animal; ,那么我们只是可以创建一个Animal类型的实例变量,如: Animal *ani;   )。至于引入类(Animal)中是如何定义的(定义了哪些实例变量和方法),是不知道的。所以在头文件中如果用 @class 声明某个类后,在.m的实现中如果用到类的具体方法或实例变量时还得再 #import类 一下。

(2)从编译时间上来说。(是编译时的时间,并非运行时的时间)

在.h头文件中进行声明时用 #import 的话,如果有许多类都 #import 同一个类,或者这些文件是依次引用同一个类的话,当引用的那个类的头文件有变化后进行编译时,后面所有引用它的类都需要重新编译,那么这将耗费大量的时间。

而用 @class 则不会耗费太多时间,用@class只是简单的告诉编译器有这个类,将这个类作为一个类型来用,让编译顺利通过就好了。如果在.m文件中还需要用引入类的实例变量和方法的的话,再 #import 一下类就好了。编译器编译的时候是只编译头文件的,所以在.m中用 #import 与编译时间没太大关系。从而会节约编译的时间。

(3)几个情况说明。

①一般如果有继承关系的用 #import。

② 另外就是如果有循环依赖关系,如:A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错

③还有就是自定义代理的时候,如果在头文件中想声明代理的话,如

@interface SecondViewController:UIViewController<XXXDelegate>时 应该应用#import,不然的话会出错误,注意XXXXDelegate是自定义的

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 14:46:51

Objective-C 【关于导入类(@class 和 #import的区别)】的相关文章

eclipse 导入类 提示The import XXX cannot be resolved

问题:eclipse 导入类 提示The import XXX cannot be resolved 原因:原来使用JDK和现在使用的JDK不同造成的buildpath不对 解决方法: 1.右键项目-------buildpath--------最下面那个configura: 2.选择libraries找到JRE: 3.选中remove掉,重新为该项目选择一个JRE: 4.project----clean,全部的包都找到了. 原文地址:https://www.cnblogs.com/nihaoy

OC 导入类 #import和@class 区别复习

objective-c中#import和@class的区别 在Objective-C中,可以使用#import和@class来引用别的类型, 但是你知道两者有什么区别吗? @class叫做forward-class,  你经常会在头文件的定义中看到通过@class的引用, 原因就是当你只用@class来引入一个类时, 编译器知道有这么一个类,也就是说它能识别Engine *engine; 而在implementation文件中,如果你想要访问engine.price, 编译器就会出错, 即使你用

@Import直接导入类,在容器@Component中是怎么直接导入类注册到容器的?

Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 Spring 的 定义中,它要求所有的 IoC 容器都需要实现接口 BeanFactory ,它是一个顶级容器接口 . 接下来就和大家分享一下, //直接插入一个类,既可以注册到容器 //这里注意注册的Bean的名称是全类名 @Import(Stu.class) @Configuration pub

MyPython--&gt;进阶篇--&gt;导入类

导入类 class my_cars(): def __init__(self,make,model,year): self.__make = make self.__model = model self.__year = year self.__runreading = 0 def getmake(self): return print('make from %s'%self.__make) def setmake(self,setmake): self.__make = setmake 将上述

python导入类

导入类的方法: 1.from 模块 import 类名 在主文件中,使用就是:类名 2.import 模块 在主文件中,使用就是:模块.类名 3.导入模块当中所有类 (不推荐) from  module_name import  * 4.从一个模块当中,导入另一个模块 有时候,需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类.将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类.在这种情况下,可在前一个模块中导入必要的类.例如,下面将 Car 类存储在一

使用 sqoop 将mysql数据导入到hive(import)

Sqoop 将mysql 数据导入到hive(import) 1.创建mysql表 CREATE TABLE `sqoop_test` ( `id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 插入数据 2.hive 建表 hive> create external table sqoop_test

import static与import的区别

import static(静态导入)是JDK1.5中的新特性,一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*;这里多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法.当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了.然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名的方式来调用. 例如,

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

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

import static和import的区别(转)

import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*;这里的多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法.当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了.然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名 的方式来调用. 这种方