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

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

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

相关文章

Python Tkinter GUI图形化开发

Python Tkinter GUI图形化开发 今天我想和大家分享一下Python中使用Tkinter进行GUI图形化开发的经验和心得。Tkinter作为Python内置的标准GUI库&#xff0c;简单易用&#xff0c;是快速开发桌面应用程序的不错选择。今天的分享适合初学者和有一定基础的开发者&#xff0c;希望…

关于下载 IDEA、WebStorm 的一些心得感想

背景 实习第一天的时候&#xff0c;睿哥便吩咐我下载一些软件&#xff0c;这些软件以后在写项目的时候会用到&#xff0c;他叫我先装IDEA,WebStorm&#xff0c;微信开发者工具&#xff0c;git&#xff0c;还有Navicat。 这些软件能够被我们正常使用&#xff0c;无非就通过三步…

浅谈配置元件之TCP取样器配置/TCP取样器

浅谈配置元件之TCP取样器配置/TCP取样器 1.引言 在进行网络性能测试时&#xff0c;TCP取样器配置和TCP 取样器&#xff08;TCP Sampler&#xff09;是两个重要的组件&#xff0c;他们允许用户直接发送和接收TCP 数据包&#xff0c;这对于测试服务器的TCP 连接处理能力、模拟特…

Arduino-ESP32的CAN波特率设置为1M代码,不用改底层。

前面调CAN的时候&#xff0c;发现CAN的实际的波特率是设置的波特率的一半。然后还去看手册&#xff0c;推公式&#xff0c;改底层库的代码。后面发现不用这么麻烦&#xff0c;换一下使用的库和配置函数就行。使用CAN.h头文件的配置函数就会出现CAN的实际的波特率是设置的波特率…

使用opencv合并两个图像

本节的目的 linear blending&#xff08;线性混合&#xff09;使用**addWeighted()**来添加两个图像 原理 (其实我也没太懂&#xff0c;留个坑&#xff0c;感觉本科的时候线代没学好。不对&#xff0c;我本科就没学线代。) 源码分析 源码链接 #include "opencv2/imgc…

函数柯里化:简化 JavaScript 函数调用的神奇技巧

函数柯里化 在 JavaScript 中&#xff0c;函数柯里化&#xff08;Currying&#xff09;是一种强大的技术&#xff0c;可以帮助我们简化函数的调用方式&#xff0c;增强代码的灵活性和可复用性。本文介绍函数柯里化的基本概念、实现方法以及几个实用的应用场景&#xff0c;适合…

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

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

Win11 设置本地管理员账户的几种方法总结

从设置界面创建 Win11 设置本地管理员账户我们可以在设置界面来进行设置&#xff0c;下面是具体的操作步骤&#xff1a; 首先我们需要打开设置界面&#xff0c;然后点击“账户”选项&#xff0c;进入之后点击“其他用户”。 然后在用户界面中我们找到“其他用户”模块下的添加…

AMD vs NVIDIA:渲染领域的显卡之争

在数字创意与设计的世界里&#xff0c;显卡作为图形处理的核心&#xff0c;其性能与兼容性直接关系到创作者的工作效率与作品质量。AMD与NVIDIA&#xff0c;作为两大显卡巨头&#xff0c;各自在渲染领域拥有独特的技术与优势。那么&#xff0c;针对渲染而言&#xff0c;哪种显卡…

四川古力未来科技有限公司抖音小店解锁电商新机遇

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。四川古力未来科技有限公司紧跟时代步伐&#xff0c;积极拥抱变革&#xff0c;在抖音平台上开设小店&#xff0c;为品牌发展注入了新的活力。那么&#xff0c;四川古力未来科技有限公司抖音小店究竟…

C#和python端通信之使用共享内存

一、前言 本篇主要实验通过使用共享内存实现C#端代码和python端代码之间的通信&#xff0c;主要目的是相较于直接传输较大的数据&#xff08;例如图像数据&#xff09;&#xff0c;该方式更节省时间。 二、代码 C#端&#xff1a; 创建了一个大小为1的共享内存&#xff0c;名为…

Js-w3school(2024(1)

10.访问 HTML 元素 使用“不整洁的” HTML 样式的后果&#xff0c;也许是导致 JavaScript 错误。请在 HTML 中使用相同的命名约定&#xff08;就像 JavaScript 那样&#xff09; 11. 请使用正确的文档类型 请始终在文档的首行声明文档类型&#xff1a; 如果您一贯坚持小写标…

web前端程序发布:揭秘从开发到上线的四大关键、五大步骤、六大技巧与七大注意事项

web前端程序发布&#xff1a;揭秘从开发到上线的四大关键、五大步骤、六大技巧与七大注意事项 在数字化时代&#xff0c;Web前端程序是连接用户与服务器之间的重要桥梁。发布一个稳定、高效的Web前端程序&#xff0c;不仅考验着开发者的技术水平&#xff0c;更关系到用户体验和…

学懂C#编程:常用高级技术——委托(Delegate)应用场景——事件处理

事件处理&#xff1a; 委托是C#事件模型的核心。一个事件本质上是一个委托类型的字段&#xff0c;用于存储一系列方法的引用&#xff0c;当特定事件发生时&#xff0c;这些方法会被调用。 我们通过下面这个例子来讲解C#中事件&#xff08;Event&#xff09;的基本用法&#xff…

神经网络学习-池化层

池化层方法 池化一般是用来对卷积层进行降维 空洞卷积&#xff0c;通过在卷积核的元素之间插入“空洞”&#xff08;即零&#xff09;&#xff0c;可以在不增加参数量和计算量的情况下扩大卷积核的感受野。这对于捕捉图像中的多尺度信息特别有用。 池化的默认步长是池化核的大…

drogon跨域问题和全局异常处理

2024年6月20日12:21:11 在main.cc里加入 /*** 全局异常处理*/drogon::app().setExceptionHandler([](const std::exception &e,const drogon::HttpRequestPtr &req,std::function<void(drogon::HttpResponsePtr &)> &&callback){LOG_DEBUG <<…

vscode插件开发之 - 消息通信

在开发vscode插件过程中&#xff0c;有一个典型场景是webview与extension.ts进行通信&#xff0c;例如&#xff0c;webview上的某些信息发送改变时&#xff0c;需要发送消息传递给extension.ts. 如果使用react框架构建vscode插件的webview&#xff0c;如何实现webview与extensi…

Python爬虫工程师的技术栈

第一部分&#xff1a;Python爬虫工程师的技术栈 引言 Python爬虫工程师负责设计和实现自动化数据采集系统&#xff0c;从互联网上抓取所需的数据。在本文的第一部分&#xff0c;我们将详细介绍Python爬虫工程师的技术栈&#xff0c;包括爬虫框架、数据存储、并发处理、异常处…

工厂ESOP系统促进工厂快速响应和工艺改进

在当今追求可持续发展和创新的时代&#xff0c;新能源产业正以惊人的速度崛起。新能源工厂作为这一领域的核心生产环节&#xff0c;面临着不断提高效率、优化工艺和快速应用新技术的巨大挑战。为了应对这些挑战&#xff0c;越来越多的新能源工厂开始引入 ESOP 系统&#xff08;…

为什么企业需要数据挖掘平台?哪个比较好呢?

什么是数据挖掘&#xff1f; 数据挖掘就是从大量的数据中去发现有用的信息&#xff0c;然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢&#xff1f;实际上&#xff0c;数据挖掘就是智能化的数据分析&#xff0c;它们的目标都是一样的。但是&#xff0c…