当前位置: 首页 > news >正文

【iOS】#include、#import、@class、@import

文章目录

  • #include
  • #import
  • @class
  • @import
  • 总结


#include

#include是c\c++中的预处理器指令,用于包含头文件的内容

但是使用#include可能会出现重复包含文件的问题,因此需要使用(#ifndef/#define/#endif)。

#import

//导入系统头文件使用 < >
#import <UIKit/UIKit.h>
//导入自定义头文件使用 " "
#import "ViewController.h"

#import是OC中使用的引用头文件的预处理指令,优势在于使用#import可以避免重复导入头文件的问题

什么是重复导入?
A.h中导入了D.h,B.h也导入了D.h,当C.h既导入A.h又导入B.h的时候,C.h中就会重复导入D.h。
而#import确定一个文件中只能导入另一个文件一次,因此#import可以防止文件重复导入。

@class

//声明一个类
@class ViewController;
//一次声明多个类
@class ViewController, MyView, MYBookModel;

@class是OC中的一个前向声明

前向声明的含义是告诉编译器某个类或是某个结构存在,但是具体的定义稍后再提供,使用前向声明后编译器可以使用这个类,但是并不能使用类中的成员变量或是方法

使用@class有几点优势:

  • 避免循环依赖

A.h中导入了B.h,同时在A.h中定义如下属性:

@property(nonatomic, strong) B *b;

而B.h又导入了A.h,此时就会形成循环依赖,出现编译错误。

编译器会出现这种情况
在这里插入图片描述

  • 减少编译时间

如果我们使用#import在.h文件中导入文件,那么每次我们修改文件时都会重新编译导入文件,那么耗时就非常多了,但是如果我们使用@class就不会重新编译导入文件了,因为此时编译器并不知道对应文件的内部实现

具体示例解释

// MyClassB.h
@interface MyClassB : NSObject
@property (nonatomic, strong) NSString *name;
- (void)doSomething;
@end// MyClassA.h
@class MyClassB;  // 前向声明@interface MyClassA : NSObject
@property (nonatomic, strong) MyClassB *objectB;
- (void)useMyClassB;
@end// MyClassA.m
#import "MyClassA.h"
#import "MyClassB.h"@implementation MyClassA
- (void)useMyClassB {[self.objectB doSomething];
}
@end
  1. 前向声明的好处:
    MyClassA.h中只有前向声明,编译器不需要在编译MyClassA时处理MyClassB的实现。
    任何对MyClassA.h的修改都不会影响MyClassB,从而减少不必要的重新编译。
  2. 减少编译时间:
    编译MyClassA.m时,编译器才处理MyClassB.h。
    如果MyClassA.h包含了MyClassB.h,任何对MyClassB.h的修改都会触发重新编译MyClassA及其依赖的文件。

@import

#import引入差不多,但是@import只能引入苹果自己的框架

@import UIKit;        等价于==> #import <UIKit/UIKit.h>
@import UIKit.UIView; 等价于==> #import <UIKit/UIView.h>

以为在实际项目中会使用很多自定义文件与第三方框架,所以统一使用#import

总结

在.h文件中能使用@class尽量使用,而不是#import,#import尽量延后导入,能不使用尽量不使用,可以提高编译效率

相关文章:

  • 2024广东省职业技能大赛云计算赛项实战——Minio服务搭建
  • CTFHUB-SSRF-端口扫描
  • DDMA信号处理以及数据处理的流程---cfar检测
  • 【database3】oracle:数据交换/存储/收集
  • Vite: 关于静态资源的处理机制
  • 计算机组成原理 —— 存储系统(DRAM和SRAM,ROM)
  • Typora Markdown编辑器 for Mac v1.8.10 安装
  • SCI一区级 | Matlab实现BO-Transformer-LSTM多变量时间序列预测
  • 图像数字化基础
  • python实现无人机航拍图片像素坐标转世界坐标
  • go语言:数据库sql查询保存任意数量字段的数据
  • yii2 ActiveForm使用技巧
  • DS:二叉树的链式存储及遍历
  • 解析Java中1000个常用类:AbstractSequentialList类,你学会了吗?
  • 视觉新纪元:解码LED显示屏的视角、可视角、最佳视角的最终奥秘
  • 230. Kth Smallest Element in a BST
  • ERLANG 网工修炼笔记 ---- UDP
  • IndexedDB
  • Mac转Windows的拯救指南
  • QQ浏览器x5内核的兼容性问题
  • zookeeper系列(七)实战分布式命名服务
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何胜任知名企业的商业数据分析师?
  • 详解NodeJs流之一
  • 正则学习笔记
  • gunicorn工作原理
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #include
  • #pragma multi_compile #pragma shader_feature
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (JS基础)String 类型
  • (solr系列:一)使用tomcat部署solr服务
  • (二)linux使用docker容器运行mysql
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转) 深度模型优化性能 调参
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET面试题(二)
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .Net中ListT 泛型转成DataTable、DataSet
  • /usr/bin/env: node: No such file or directory