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

news2024/10/23 22:21:51

文章目录

  • #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尽量延后导入,能不使用尽量不使用,可以提高编译效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux-目录和文件

目录 一、Linux目录 1、Linux常见目录 2、常见的Linux文件类型 二、cat-查看文件命令 1、cat命令用法 三、分页查看文件内容 1、 more命令 ​2、less命令 ​3、more和less的区别 四、查看文件开头或末尾 1、head命令 2、tail命令 3、wc-统计文件内容 4、grep 命令…

NLP基础概念

NLP任务不同于CV任务&#xff0c;它存在更多难点&#xff0c;例如&#xff1a; 数据表示&#xff1a;NLP任务处理的是文本数据&#xff0c;需要将自然语言文本转化为计算机可处理的形式&#xff0c;即如何把字符串变为数值数据&#xff0c;常用的有词嵌入&#xff08;Word Embe…

20240621 每日AI必读资讯

&#x1f916;GPT-4 通过图灵测试&#xff01;&#xff01; 研究人员称人们在图灵测试中无法区分 GPT-4 和人类&#xff0c;圣地亚哥加州大学认知科学系的研究人员针对GPT 4复刻了图灵测试。 研究人员招募了500名参与者&#xff0c;与四个代理人&#xff1a;人类、1960年代的…

英伟达和IBM搞事情!主攻“量子计算+AI”

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨娴睿/慕一 排版丨沛贤 深度好文&#xff1a;2000字丨8分钟阅读 Ismael Faro是一位计算机工程师&#xff0c;自2015年以来&#xff0c;他就成为开发IBM量子软件生态系统的重要人物。从2016…

Debugger的使用

断点调试 1.打断点 2.以debug模式运行 3.流程控制

一款Wordpress网站导航主题,带昼夜切换功能

Wordpress网站导航主题&#xff0c;带昼夜切换功能。 基于wordpress&#xff0c;部署和使用都比较方便。 界面比较简洁大方。后台管理功能也比较全面&#xff0c;值得一试。 这款主题界面、功能都非常简洁。 作者把这款定位为简约导航主题&#xff0c;所以这款wordpress导航…

61.WEB渗透测试-信息收集- WAF、框架组件识别(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;60.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;8&#xff09; WAF的识…

西米支付:【风控升级】同一商户集中交易,将会限制正常用卡

支付公司风控策略再升级&#xff01;近日&#xff0c;有某支付公司代理透漏&#xff0c;客户反馈机器突然不能刷卡了&#xff0c;换卡也无法交易&#xff0c;交易均提示06-超出商户限额&#xff0c;然而该款机器刷卡限额为单日30万&#xff0c;单月300万&#xff0c;客户并未触…

使用MyBatisPlus进行字段的自动填充

使用MyBatisPlus进行字段的自动填充 需求场景 当我们往数据库里面插入一条数据&#xff0c;或者是更新一条数据时&#xff0c;一般都需要标记创建时间create_time和更新时间update_time的值&#xff0c;但是如果我们每张表的每个请求&#xff0c;在执行sql语句的时候我们都手…

arco design表单label和输入框的空间分布

表单空间分布 arco利用的栅格系统来实现label、input的大小分布 <a-form :model"formData.form" :label-col-props"{ span: 6 }" :wrapper-col-props"{ span: 18 }" >// 其它...... </a-form>栅格系统中&#xff0c;默认空间总量2…

web 腾讯地图怎么设置卫星底图??

引用腾讯地图JavaScript SDK (腾讯地图引用文档) 设置卫星底图代码如下&#xff1a;官网示例 new TMap.Map("container", {// zoom: 16, //设置地图缩放级别zoom: 17.2, //设置地图缩放级别center: new TMap.LatLng(lat, long), //设置地图中心点坐标pitch: 35, //…

OZON彩妆热销产品,OZON热销化妆品

在当今的电商时代&#xff0c;OZON平台以其卓越的服务和丰富的产品种类&#xff0c;成为了众多消费者和美妆爱好者的首选。特别是在彩妆领域&#xff0c;OZON平台上的热销产品不仅满足了消费者的多样化需求&#xff0c;更引领了美妆新潮流。本文将为您详细解读OZON彩妆热销产品…

Matlab个性化绘图第3期—带三维球标记的折线图

前段时间有会员在群里问该如何绘制下面这种带三维球标记的折线图&#xff1a; 本期内容就来分享一下带三维球标记的折线图的Matlab绘制思路。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需…

Arduino平台软硬件原理及使用——无源蜂鸣器模块的使用

文章目录 一、蜂鸣器发声原理 二、无源蜂鸣器与有源蜂鸣器的区分 三、无源蜂鸣器模块在Arduino中的使用 一、蜂鸣器发声原理 上图为常见的不同封装及规格的蜂鸣器。 同蜜蜂、知了等昆虫发声原理一样&#xff0c;蜂鸣器同样靠振动来发出声音&#xff1b; 如上图为无源蜂鸣器的内…

【比较版本号】

比较版本号 一、题目二、方法一&#xff1a;s.split()parseInt()三、方法二&#xff1a;优化空间复杂度——双指针四、补充&#xff1a;charCodeAt()函数 一、题目 二、方法一&#xff1a;s.split()parseInt() 使用split将版本号的字符串拆分为数组&#xff0c;再将数组中的每一…

c#考试知识点

第一题 //数组{1&#xff0c;2&#xff0c;3&#xff0c;&#xff0c;8&#xff0c;6} //方法&#xff08;数组&#xff0c;目标值&#xff09; //输出 //接收一个数组&#xff0c;输出目标值是数组中哪两个数的和&#xff0c;并输出下标 using System; using System.Collectio…

从零开始学代码写了一个心理学知识导航站

我从零编码经验开始开发一个网站。最初我只是想把自己收集到的心理学知识和一些资源分享出来&#xff0c;希望能够让更多的用户受益。 然而&#xff0c;在写作时&#xff0c;我意识到&#xff0c;尽管函数和界面是使用 GPT 从头开始​​手工编写的&#xff0c;而且我没有使用所…

Vite文件目录结构介绍

我们通过命令create-vite shop-admin基于Vite创建vue3项目后&#xff0c;其默认的文件目录结构如下&#xff1a; shop-admin ├─ index.html ├─ package-lock.json ├─ package.json ├─ public │ └─ vite.svg ├─ src │ ├─ App.vue │ ├─ assets │ │ └…

Codeforces Global Round 26 F. Reconstruction(枚举+dp)

题目 Problem - F - Codeforces 思路来源 稲葉廻代码 题解 前面补一个0&#xff0c;字母对应P&#xff0c;后面补一个0&#xff0c;字母对应S 中间必有一个分界处是PS相邻&#xff0c; PS相邻一个是前缀和一个是后缀和&#xff0c;就可以唯一确定这个序列的和 枚举这个…

Vue3 【仿 react 的 hook】封装 useTitle

效果预览 页码加载时&#xff0c;自动获取网页标题通过input输入框&#xff0c;可以实时改变网页标题 代码实现 index.vue <template><h1>网页的标题为&#xff1a; {{ titleRef }}</h1><p>通过input输入框实时改变网页的标题 <input v-model"…