`

#import与@class的区别

    博客分类:
  • IOS
 
阅读更多
1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.


举个例子说明一下。
在ClassA.h中
#import ClassB.h 相当于#include整个.h头文件。如果有很多.m文件#import ClassA.h,那么编译的时候这些文件也会#import ClassB.h增加了没必要的#import,浪费编译时间。在大型软件中,减少.h文件中的include是非常重要的。

如果
只是 ClassB 那就没有include ClassB.h。仅需要在需要用到ClassB的.m文件中 #import ClassB.h

那么什么时候可以用呢?
如果ClassA.h中仅需要声明一个ClassB的指针,那么就可以在ClassA.h中声明
@ClassB
...
ClassB *pointer;


假设,有两个类:ClassA和ClassB,两个之间相互使用到,即构成了circular dependency(循环依赖)。如果在头文件里面只用#import把对方的头文件包含进来(构成circular inclusions,循环包含),则编译器会报错:
Expected specifier-qualifier-list before ‘ClassA’
或者
Expected specifier-qualifier-list before ‘ClassB’
为了避免循环包含,在ClassA.h文件里面用@class classB把classB包含进来,同样,在ClassB.h文件里面用@class ClassA把ClassA包含进来。@class指令只是告诉编译器,这是个类,保留个空间来存放指针就可以了。
接下来,很可能在ClassA.m和ClassB.m中会有访问包含进来对象的成员的情况,这时必须让编译器知道更多信息,比如那个类有些什么方法可以调用,就必须用#import,再次把用到的类包含进来,告诉编译器所需要的额外信息。
否则,编译器会警告:
warning: receiver ‘ClassA’ is a forward class and corresponding @interface may not exist
还有另一种情况,使用有Categories的类,要在.h头文件里用#import把Categories包含进来。
总之,使用原则是:
头文件里面只#import超类 消息文件里面#import需要发消息过去的类 其他地方就用@class转向声明
分享到:
评论

相关推荐

    iOS开发中#import、#include和@class的区别解析

    在iOS开发中,我们经常会遇到#import、#include和@class这三个指令,它们在不同的场景下有着不同的作用和使用规范。理解它们的区别对于优化代码结构和提高编译效率至关重要。 首先,#import是Objective-C中的标准...

    简单谈谈c/c++中#import、#include和@class的区别

    1. import会包含这个类的所有信息,包括实体变量和方法(.h文件中),而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,后面会再告诉你。 2. 在头文件中, 一般只需要知道被引用的类的...

    iOS开发中class和#import的区别介绍

    总结一下,`@class` 和 `#import` 的主要区别在于: 1. `@class` 只声明类的存在,不包含类的具体信息,用于减少编译时的依赖,提高编译性能。 2. `#import` 导入类的完整头文件,包含所有信息,方便使用但可能导致...

    iOS面试题及答案

    本文总结了 iOS 面试题及答案,涵盖了 OC 语言的基本特点、#import 与 @class 的区别、类目优缺点、内存管理的基本原则、ARC 技术、垃圾回收机制、深浅复制、堆栈区差别、用户自定义对象的拷贝、定义属性时的赋值...

    iOS笔试题011

    一、#import、@class 的区别 #import 和 @class 都可以用来包含某个文件的内容,但是它们之间有一些关键的区别: * #import 能防止同一个文件被包含多次,而 @class 只是声明一个类名并不包含类的完整声明。 * #...

    购物车的源程序

    @ page language=”java” import=”java.sql.*” %> id=”bka” scope u201dpage” class=”shop.bka” /><%String product_type;String action;int product_id;int curpage;//商品类型i

    spring4.0 Configuration的使用.docx

    @Import({SecurityConfig.class, DatabaseConfig.class}) public class AppConfig { } ``` ##### 2.3 @configuration 嵌套(嵌套的 Configuration 必须是静态类) - **实现方式**:可以在一个配置类内部定义另...

    2021iOS笔试题总结.pdf

    2. #include与#import的区别,以及#import与@class的区别: #include和#import都能够导入头文件,但#import能够防止头文件的交叉包含,确保头文件只被导入一次。而#import和@class的区别在于,#import会包含类的...

    iOS 面试题

    iOS 面试题: Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?...2.#import 跟#include 又什么区别,@class呢, #import<> 跟 #import”"又什么区别?

    欧柏泰克:Java包的静态导入import static和import的区别

    欧柏泰克:Java包的静态导入import static和import的区别 Java中的静态导入是Java 5中引入的一项新特性,允许开发者在编写代码时更方便地使用静态方法和成员变量。下面我们来详细地了解Java中的静态导入和普通导入...

    @scheduled任务调度使用详解及@scheduled与多线程和@Async异步任务结合使用

    本篇文章将深入讲解`@Scheduled`的使用方法,以及如何将其与多线程和`@Async`异步任务相结合,提升应用程序的效率。 ### `@Scheduled`任务调度 `@Scheduled`是Spring Framework中的一个注解,它允许我们在不需要...

    IOS 头文件导入-@class注意事项总结

    IOS 头文件导入-@class注意事项总结 IOS 头文件导入是 iOS 开发中一个非常重要的步骤,它可以帮助开发者在项目中引入需要的头文件,以便使用各种类和方法。但是,头文件的导入需要注意一些问题,否则可能会导致编译...

    tedu二阶段Lombok

    #### 二、Lombok 的安装与配置 ##### 1. 引入依赖 要在项目中使用 Lombok,首先需要在项目的 `pom.xml` 文件中添加 Lombok 的 Maven 依赖: ```xml <!-- 引入 Lombok 依赖 --> <groupId>org.projectlombok ...

    浅谈Spring中@Import注解的作用和使用

    @Import({TestBean1.class, TestBean2.class}) public class AppConfig { // ... } ``` 在上面的示例中,我们使用 @Import 注解将 TestBean1 和 TestBean2 两个bean 导入到 AppConfig 配置类中。这样我们可以在 ...

    @EnableAutoConfiguration原理

    - `@Import(AutoConfigurationImportSelector.class)`:导入了`AutoConfigurationImportSelector`类,该类是决定哪些自动配置类应该被导入的关键。 ##### 2.4 自动配置类的特点 - 自动配置类通常是标准的Spring配置...

    jsp实现购物程序

    下面是我用JSP和数据库做的购物车的源程序:注意:1、重新计费部分还没有...@ page language=java import=java.sql.* %><jsp id=bka scope=page class=shop.bka><%String product_type;String action;int produ

    java-package与import机制

    ### Java Package与Import机制详解 #### 一、引言 对于很多刚开始接触Java编程的初学者来说,往往是从购买一本入门书籍开始他们的Java学习之旅。在这个过程中,他们可能会下载最新的Java SDK并安装在自己的电脑上...

Global site tag (gtag.js) - Google Analytics