A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Ye•Ye 中级黑马   /  2014-5-7 15:56  /  1386 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Ye•Ye 于 2014-5-10 10:35 编辑

看视频里说两个文件的头文件不能互相调用,不能理解什么意思。
那两个.h文件在.m文件里为什么就可以互相调用呢?能讲一下原理吗?

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1

查看全部评分

1 个回复

正序浏览
这样说吧,先拿一个函数举例:比如你写了一个void test()函数;那么如果你像调用该方法的话,要么把这个函数写在main之前;要么写在main之后,但是要在main之前对这个函数声明;
  1. void test(); // 函数声明
  2. int main()
  3. {
  4.     test(); // 函数调用
  5. }
  6. void test() // 函数实现
  7. {
  8.     .........
  9. }
复制代码

   类也一样,要想创建某个类的对象,你得把类声明搞过来吧;
1:而在OC中,@interface中的,就是类的声明,implementation是类的实现。而根据xcode编译时的特点,我们习惯把类的声明,放在头文件:***.h中,实现自然在***.m中;
2:而在另一个文件里我们想要用这个类,我们只需要:import "***.h"就行了,而这个import相当于是把***.h里的代码拷贝过去了,不存在什么.h文件的互相调用,这个叫文件包含更好一点;
3:你的问题我比较不太懂,就当做你不明白:为什么包含的是.h文件而不是.m文件吧;说实话,谁都可以包含谁,之所以我们包含.h文件是因为:xcode编译器,编译链接时,他会让项目中所有的.m文件参与编译,生成.o 文件,如果你包含了.m文件,按照xcode的编译方式编译,会出现类的重复实现,从而报错;
举个例子吧:
Person.h头文件中放的是Person类的声明,Person.m文件中是它的实现;现在你在另外一个main.m文件想要用Person类:假设我们包含了Person.m文件,就是这样了:
  1. #import "Person.m" // 这句话相当于把Person类的实现的代码拷贝到这了;
  2. int main()
  3. {
  4.    ...........
  5. }
复制代码

那么xcode会这样编译链接是这样的: cc  Person.m  main.m -framework Foundation;
请注意:这样Person.o里会由Person类的实现,main.o也由Person类的实现(因为你包含了Person.m文件),这时会报一个链接错误:Person重复实现的错误;
当然你如果通过终端,自己手动敲 : cc main.m -framework Foundation 不要编译Person.m 文件,自然不会出错;但是xcode 不会这么干,所以为了我们包含.h文件,即类的声明即可;
不知道你能不能理解,多想想;

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马