浅谈iOS关于头文件的导入问题

关于import和@class的使用问题

.@class的出现可以适当减少编译时间,提高效率。

现在假设有两个类,一个是Teacher类,一个是Students类。

Teacher类

#import <Foundation/Foundation.h>
#import "Students.h"

@interface Teacher : NSObject

@property (copy,nonatomic)NSString *firstName;
@property (copy,nonatomic)NSString *lastName;
@property (strong,nonatomic)Students *student;

@end

在类中声明三个属性,其中有一个属性为Students类属性。这时候既然使用到Students类,就需要导入该类的头文件。如如上代码。

注意:此时使用的是import导入的。这个方法可行但是不够优雅,存在一个问题,在声明文件中,我们不需要知道Students类的全部细节,只需要知道类名是Students就可以。如下使用@class解决问题,这叫“向前声明”该类。

Teacher.h

#import <Foundation/Foundation.h>

@class Students;

@interface Teacher : NSObject

@property (copy,nonatomic)NSString *firstName;
@property (copy,nonatomic)NSString *lastName;
@property (strong,nonatomic)Students *student;

@end

Teacher.m

#import "Teacher.h"
#import "Students.h"

@implementation Teacher

@end

Teacher类的实现文件就需要知道Students类的全部借口细节,因此就需要在此时使用import “Students.h”。

将引入头文件的时机尽量延后,只有在确有需要的时候才引入,这样就可以减少类的使用者所需引入的头文件的数量。假如在.h文件的时候就是用import导入,就会引入很多不需要使用的内容,这必然会增加编译时间。

.@class的出现也两个类互相引用的问题。

Teacher.h

#import <Foundation/Foundation.h>

#import "Students.h"

@interface Teacher : NSObject

@property (copy,nonatomic)NSString *firstName;
@property (copy,nonatomic)NSString *lastName;
@property (strong,nonatomic)Students *student;

@end

Students.h

#import <Foundation/Foundation.h>

#import "Teacher.h"

@interface Students : NSObject

@property (strong,nonatomic)Teacher *teacher;

@end

在Students类中import “Teacher.h”,同时在Teacher类中import “Students”类,这就造成了循环引用问题,程序在编译的时候就会出现无休止的编译。此时只需要将其中一个import改成@class即可,如果两者的.h文件都不需要知道对方类的全部借口细节,最佳方案是全部使用@class。

小结

除非确实有必要,就不要引入头文件。一般来说,在.h文件中应该使用向前声明来提及别的类,然后在.m文件引入那些类的头文件。这样做可以尽量降低类的耦合。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 简单谈谈C++ 头文件系列之(iosfwd)

    简介 输入输出历来都是语言的重要部分,在C++中,该库也是占据了相当大的一部分. C++的输入输出库是其遵循面向对象设计的结果,并结合了泛型编程. 以下是这些库类的关系图(箭头标示继承,白框表示摸板,黑框表示摸板实例): iosfwd声明 该文件的全称是"input output stream forward",即输入输出流前向声明. 顾名思义,该头文件的主要目的就是为用户提供所有输入输出类的声明. 当你在某些只需要这些类声明,而不需要定义的地方 (例如:自定义的头文件中),就可以简单

  • iOS利用AFNetworking3.0——实现文件断点下载

    0.导入框架准备工作 1. 将AFNetworking3.0+框架程序拖拽进项目 2. 或使用Cocopod 导入AFNetworking3.0+ 3.  引入 #import "AFNetworking.h" 1.UI准备工作 A. 定义一个全局的 NSURLSessionDownloadTask:下载管理句柄 由其负责所有的网络操作请求 @interface ViewController () { // 下载句柄 NSURLSessionDownloadTask *_downloa

  • iOS利用AFNetworking实现文件上传的示例代码

    0.导入框架准备工作 1. 将框架程序拖拽进项目 2.  添加iOS框架引用 –SystemConfiguration.framework –MobileCoreServices.framework 3.  引入 #import "AFNetworking.h" 4. 修改xxx-Prefix.pch文件 #import <MobileCoreServices/MobileCoreServices.h> #import <SystemConfiguration/Sys

  • Vue axios 中提交表单数据(含上传文件)

    我们经常使用表单来上传数据,以及上传文件,那么怎么在表单提交成功的时候接受服务器的响应,并作出相应操作. 当然使用一般jQuery上传对象的格式也是可以的,如果使用传统的表单上传呢? <!DOCTYPE html> <html lang="en"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport

  • ios用AFN进行文件上传的示例代码

    App中个人信息页面,通常都会有设置头像的功能.当用户从相册中选择图像或者拍摄照片成功后,一般都需要将照片发送到服务器进行保存,以方便用户在其他设备或者再次登陆后,能再次从服务器请求到设置的照片.项目中通过AFN,实现起来很方便. - (void)upload{ NSData *imageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mine.jpeg" ofType:nil

  • Vue开发中整合axios的文件整理

    前言 大家在vue日常开发中,不可避免要整合axios,这里简单记录一下整合中的文件,方便以后使用查找.下面来看看详细的介绍. 整合方法 整合文件axios.js import axios from 'axios'; // 适配vue-resource const instance = axios.create(); instance.interceptors.request.use(config=> { //Serialize.decode(config); return config; })

  • 详解IOS中文件路径判断是文件还是文件夹

    详解IOS中文件路径判断是文件还是文件夹 方法1 + (BOOL)isDirectory:(NSString *)filePath { BOOL isDirectory = NO; [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory]; return isDirectory; } 方法2 + (BOOL)isDirectory:(NSString *)filePath { NSNum

  • 浅谈iOS关于头文件的导入问题

    关于import和@class的使用问题 一.@class的出现可以适当减少编译时间,提高效率. 现在假设有两个类,一个是Teacher类,一个是Students类. Teacher类 #import <Foundation/Foundation.h> #import "Students.h" @interface Teacher : NSObject @property (copy,nonatomic)NSString *firstName; @property (cop

  • 浅谈IOS如何对app进行安全加固

    防止 tweak 依附 通常来说,我们要分析一个 app,最开始一般是砸壳, $ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/XXX.app/XXX 然后将解密之后的二进制文件扔给类似 hopper 这样的反编译器处理.直接将没有砸壳的二进制文件扔个 hopper 反编译出来的内容是无法阅读的(被苹果加密了).所以说砸壳是破解分析 app 的第一步.对于这一步的防范,有两种方式. 1.限制二进制文件头内的段 通过在 Xcode 里面工程配

  • 浅谈iOS开发中static变量的三大作用

    (1)先来介绍它的第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话,我举例来说明.我们要同时编译两个源文件,一个是a.c,另一个是main.c. 下面是a.c的内容 char a = 'A'; // global variable void msg() { printf("Hello\n"); } 下面是main.c的内容 int main(void) { extern char a; // extern v

  • 浅谈hibernate之映射文件VS映射注解

    前言 对于java开发者而言,注解应该不是一个陌生的概念,早在JavaSE阶段,例如@Override标记重写父类方法或实现接口方法,@Test标记单元测试方法,所以我们可以简单地把它理解为一种有特殊含义的标记...在开发过程中,我们还可以用注解方式替代配置文件实现相关功能,例如Java web开发中,3.0版本后,利用@WebServlet.@WebListener等注解分别可以替代web项目XML配置文件中相关内容.而本文中讲述的就是Hibernate的映射配置文件与映射注解的对比,这两种方

  • 浅谈Python数学建模之数据导入

    目录 一.数据导入是所有数模编程的第一步 二.在程序中直接向变量赋值 2.1.为什么直接赋值? 2.2.直接赋值的问题与注意事项 三.Pandas 导入数据 3.1.Pandas 读取 Excel 文件 3.2.Pandas 读取 csv 文件 3.3.Pandas 读取文本文件 3.4.Pandas 读取其它文件格式 四.数据导入例程 一.数据导入是所有数模编程的第一步 编程求解一个数模问题,问题总会涉及一些数据. 有些数据是在题目的文字描述中给出的,有些数据是通过题目的附件文件下载或指定网址

  • 浅谈iOS应用中的相关正则及验证

    1.手机号码的验证正则 正则表达式: ^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$ 详细解释 解释: •^...$: ^:开始 $:结束 中间为要处理的字串 •(13[0-9]): 以13开头接下来一位为0-9之间的数 13 : 以13开头 [0-9]:分割语法,13后面是0-9之间的数 •| : 或(or), 将前后两个匹配条件进行or运算 • (15[^4\\D]) : 以15开头接下来一位是除4之外的0-9数字 15 : 以15开头 [^4\\D

  • 浅谈struts1 & jquery form 文件异步上传

    1.概述 还在用struts1?是的,在地球的没写地方,落后的生产方式还在运转(老项目). 从 继承org.apache.struts.action.Action, 继承org.apache.struts.action.ActionForm开始吧 2. 代码 2.1 html页面 <html> <head> <title>网页上传</title> </head> <body> <center> <h1>本地文件

  • 浅谈java项目与javaweb项目导入jar包的区别

    现在的项目基本上都是java web项目,所以导入jar包会出现问题,主要介绍一下java项目与javaweb项目的区别: java项目: 在classLoader加载jar和class的时候,是分开加载的,一般jar导入分两种: 1.在web-inf下的lib中直接引入 2.在user library上引入 无论以上哪种引入,jar包都能加载并且运行,classLoader会智能加载(本地JRE运行) javaweb项目: 不是通过本地的JRE运行的,而是部署到web服务器(比如tomcat,

  • 浅谈iOS中几个常用协议 NSCopying/NSMutableCopying

    1.几点说明 说到NSCopying和NSMutableCopying协议,不得不说的就是copy和mutableCopy. 如果类想要支持copy操作,则必须实现NSCopying协议,也就是说实现copyWithZone方法; 如果类想要支持mutableCopy操作,则必须实现NSMutableCopying协议,也就是说实现mutableCopyWithZone方法; iOS系统中的一些类已经实现了NSCopying或者NSMutableCopying协议的方法,如果向未实现相应方法的系

  • 浅谈python写入大量文件的问题

    今天准备把几个txt文件合并成一个文件时,用f.write方法写入时,发现程序执行完了,本应该十万行左右的txt记录,实际上只被写入了4k多行. 网上查了是因为程序执行速度太快,以至于读到内容还没有完全写入文件,文件就已经关闭了 方法一:加入缓冲区 f.flush() //operation os.fsync(output) f.close() 打开文件后执行flush(),关闭文件前执行os.fsync()确保缓冲区的内容都写出去了. 方法二:用sleep 用了上述方法不行,因为我在打开文件后

随机推荐