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

2024-06-20 20:20
文章标签 ios import class include

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

这篇关于【iOS】#include、#import、@class、@import的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079163

相关文章

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

ImportError: cannot import name ‘print_log‘ from ‘logging‘

mmcv升级到2.+后删除了很多 解决 查FAQ文档,找到 添加到mmcv.utils下即可

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes

UserWarning: mkl-service package failed to import

安装完成anaconda,并设置了两个环境变量  之后再控制台运行python环境,输入import numpy as np,提示错误 D:\InstallFolder\Anaconda3\lib\site-packages\numpy\__init__.py:143: UserWarning: mkl-service package failed to import, therefore

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注