第二条、在类的头文件中尽量少引入其他头文件

第二条、在类的头文件中尽量少引入其他头文件

当我们在一个类中去引入另一个类的时候,我们经常会这样使用:

#import "xxxx.h"
这是一种常见的方法,但是不够优雅。举个例子。在Driver类中
Driver.h

#import <Foundation/Foundation.h>

@interface Driver : NSObject

@property(nonatomic)NSString *name;
@property(nonatomic)NSString *driverCard;
@end

当我们想在该类中引入Car类时,即:

@property(weak)Car *myCar;

很明显我们一般都是:

  #import "Car.h"   

但是我们在编译一个使用了Driver类的文件时,我们不需要知道Car类的全部细节,只需要知道有个类名叫Car就好,所幸有个方法能把这个情况告诉编译器:

@class Car;   

此时Driver.h文件如下:

#import <Foundation/Foundation.h>
@class Car;
@interface Driver : NSObject

@property(nonatomic)NSString *name;
@property(nonatomic)NSString *driverCard;
@property(weak)Car *myCar;
@end

这叫做“向前声明(forward declaring)”该类。
Driver类的实现文件则需要引入Car的头文件,因为要使用Car,则必须要知道其所有接口细节。于是Driver实现头文件就是:
Driver.m

#import "Driver.h"
#import "Car.h"
@implementation Driver

@end

将其引入头文件的时机尽量延后,只在有需要的时候才引入,这样就可以减少类的使用者所需引入的头文件的数量。加入本例把Car.h引入到Driver.h中,那么只要引入Driver.h,就会一并引入Car.h中的所有内容。此过程若持续下去,则要引入许多根本用不到的内容,这样会增加编译时间。

总结

  • 除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合(coupling).
  • 有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,应尽量把“该类遵循某协议”的这条声明移至“class-continuation分类中”。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。
时间: 2024-08-05 13:55:13

第二条、在类的头文件中尽量少引入其他头文件的相关文章

qt txt文件 中文 乱码-Qt5中用QTextStream向txt文件中写入中文字符串,打开文件时出现乱码

问题描述 Qt5中用QTextStream向txt文件中写入中文字符串,打开文件时出现乱码 在网上查了一些关于Qt中文乱码的问题,主要是因为机器的编码问题QTextCodec::setCodecForLocale(QTextCodec::codecForName(""GBK""));QTextCodec::setCodecForCStrings(QTextCodec::codecForName(""GBK"")); QText

使用qt5操作xml文件,删除xml文件中的节点和修改xml文件节点的数据值

问题描述 使用qt5操作xml文件,删除xml文件中的节点和修改xml文件节点的数据值 使用qt5操作xml文件,删除xml文件中的节点和修改xml文件中节点的数据值. 那位大神知道,如果有代码就更好了. 谢谢 解决方案 QT XML文件 修改节点修改XML文件的节点属性值

shell .bat-将一段.bat文件中的命令转换成.sh文件中的命令

问题描述 将一段.bat文件中的命令转换成.sh文件中的命令 start jre/bin/java -jar zlzfofs.jar 9999 解决方案 BAT文件的所有命令和用法Red Hat下执行sh命令文件.bat文件中call命令的用法

android-安卓中文件中的阅读,请问安卓文件读取也是用buffedstream么

问题描述 安卓中文件中的阅读,请问安卓文件读取也是用buffedstream么 安卓中文件中的阅读,请问安卓文件读取也是用buffedstream么?具体怎么用?老师说得不理解 解决方案 http://blog.csdn.net/ztp800201/article/details/7322110

ps3-webkit-support.diff文件中新增了几个ChromeClientPOSIX文件

据国外游戏网站PS3life报道,游戏论坛NeoGaf会员日前发现PS3浏览器文件中新增加了几个ChromeClientPOSIX文件,或许PS3很快就会用上谷歌的Chrome浏览器.PS3自带浏览器的性能一直饱受诟病,虽然这些年也进行了几次升级,但是仍不能满足用户们的需求,一些玩家呼吁索尼将火狐或者Chrome引入到PS3中去.索尼在3月31日时对其PS3浏览器的Webkit内核文件进行了更新,来自NeoGaf的会员发现,ps3-webkit-support.diff文件中新增了几个Chrom

从文件中加载资源-怎么从文件中加载.res文件 获取到文件的HMODULE

问题描述 怎么从文件中加载.res文件 获取到文件的HMODULE 怎么从程序的外部记载一个.res文件 获取到这个文件的HMODULE 从而利FindResource 去查找资源 并调用资源, 这个函数的功能应该跟 LoadImage/loadCursorFromFile相似 解决方案 先用loadlibrary加载,然后getmodelhandle,然后loadxxx

scanf从文件中读入,printf写入到文件

重定向方式读写文件 #include <stdio.h> #define LOCAL int main() { #ifdef LOCAL freopen("input.txt","r",stdin); //使得scanf从文件input.txt读入 //r只读,如果文件不存在,出错 freopen("output.txt","w",stdout); //使得printf写入文件output.txt //w只写,如果

shell脚本正则匹配文件中的Email并写入到文件中代码分享_linux shell

代码如下: 复制代码 代码如下: #! /bin/bashfunction read_file(){    for line in `cat $1`    do        if [ `echo $line |grep "^[a-zA-Z0-9_-]*@[A-Za-z_-]*\.[a-zA-Z_-]*$"` ];then            echo $line >> result.txt        else            echo "---&qu

fgets-如何没从一个txt文件中读取数据,然后将这条从txt文件中删除

问题描述 如何没从一个txt文件中读取数据,然后将这条从txt文件中删除 就是用于post的模块,从txt中读取一行post信息之后将它post出去,如果post成功,就将它从日志txt中删除. 感觉这个读取还好说,一行用fgets拉出来就可以post了吧 但是这个删除该如何是好 这就是一个起到日志作用的txt,如果可以Post的情况就一条一条post出去,不可以就存进来,大家来给我一点意见吧 解决方案 从一个txt文件中读取矩阵从一个txt文件中读取矩阵从oracle中读取数据并保存在txt文