这样说吧,先拿一个函数举例:比如你写了一个void test()函数;那么如果你像调用该方法的话,要么把这个函数写在main之前;要么写在main之后,但是要在main之前对这个函数声明;
- void test(); // 函数声明
- int main()
- {
- test(); // 函数调用
- }
- void test() // 函数实现
- {
- .........
- }
复制代码
类也一样,要想创建某个类的对象,你得把类声明搞过来吧;
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文件,就是这样了:
- #import "Person.m" // 这句话相当于把Person类的实现的代码拷贝到这了;
- int main()
- {
- ...........
- }
复制代码
那么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文件,即类的声明即可;
不知道你能不能理解,多想想; |