在.h文件和.m文件里使用import指令有何区别?

有的程序员喜欢把所有import语句写在.h文件的头部。而有的程序员则喜欢把import语句写在.m文件头部。

你可能觉得写在哪里都无所谓。

那么,import语句写在.h文件和.m文件的哪一个都无所谓吗?

这并不是真的。

通常,我习惯在.h文件头部加入所有的import语句,但在有一种情况下,我只能把import语句加在.m文件里——这是为了避免交叉引用错误。

如果你不知道什么是交叉引用错误,那么这篇文章将会告诉你:关于一个交叉引用Bug:“can not find interface declaration” 

因此我建议你像我一样,平时可以将import语句都放在.h文件里,当编译器告诉你找不到某个类的声明但你明明已经导入了这个类的头文件时,把import语句移到.m文件头部。

关于一个交叉引用Bug:“can not find interface declaration”

这是GCC编译器的一个Bug,与Xcode4.2或者3.2无关。在Xcode的任何版本都会报这个错误。

你有一个类A:

#import <Foundation/Foundation.h>

#import "B.h"

@interface A : NSObject

@end

 

#import "A.h"

@implementation A

@end

还有一个类B:

#import <Foundation/Foundation.h>

#import "A.h"

@interface B : NSObject

@end

#import "B.h"

@implementation B

@end

然后你决定从A继承一个类,子类C:

#import "A.h"

@interface C : A

@end

 

#import "C.h"

@implementation C

@end

一切,OK,编译通过。然后你决定让B也继承A:

#import <Foundation/Foundation.h>

#import "A.h"

@interface B : A

@end

这时候问题来了,编译器告诉你“can not find interface of declaration for ‘A’,superclass of ‘B’”。

怎么可能?B中明明import了A.h,而且通过command键+鼠标左键,也可以从B中找到A的接口声明。你尝试了各种方法,就是找不到问题出在哪里。而且C同样是A的子类,C和B除了类名外,代码没有任何不同。难道Cocoa限制了一个类的子类数量?一个子类可以继承,第2个就不行?

不用大惊失色。问题在于A中import了B.h,而B又引用了A,这就构成了交叉引用。不过编译器却给出了一个让人混淆不清的提示“找不到父类接口”。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值