了解Objective-C 源文件组织

移动开发 iOS
本文介绍的是了解Objective-C 源文件组织,主要讲述了Objective-C的应用,我们来看内容。

了解Objective-C文件组织是本文要介绍的内容,不多说,我们直接进入文章。最简单的Objective-C程序,你都可以这样写:

  1. #import <Foundation/Foundation.h> 
  2.  
  3. @interface Book : NSObject{   
  4.       
  5. }  
  6.  
  7. -(NSString *) getPrice;  
  8.  
  9. @end  
  10.  
  11. @implementation Book  
  12.  
  13. -(NSString *) getPrice{   
  14.     return @"$17";   
  15. }  
  16.  
  17. @end  
  18.  
  19. int main (int argc, const char * argv[]) {   
  20.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  21.  
  22.     Book *book=[[Book alloc] init];   
  23.     NSLog(@"Book price: %@",[book getPrice]);   
  24.     [pool drain];   
  25.     return 0;   
  26. }  

理论上讲,按照上面的写法,你可以把所有的代码都写在一个文件里。

但是问题是,你不便于维护这个代码。代码很长,很乱。

所以,一般有以下几种形式来拆分和组织代码:

类文件拆分为头文件和m文件

使用组的概念来管理文件

拆分接口和实现部分

拆分h文件和m文件很好理解。只要使用Xcode做开发,通过向导页面创建类,文件默认情况下就是强制分开的:

了解Objective-C 源文件组织

使用组的概念管理文件

使用组的概念。在Xcode下面,程序源文件都是放在Source目录下的,在该目录下,可以进一步创建“目录”,把不同用途的源文件分类放置。这样就如同桌上凌乱的书归置到书架里一样。很好查找和查阅。

了解Objective-C 源文件组织

可以看到,下面是把Book相关的一些类放在book组中了。

了解Objective-C 源文件组织

这个组看起来是目录,但如果你打开finder,查看目录结构,发现并不存在这样的目录:

了解Objective-C 源文件组织

拆分文件带来的问题及解决办法

拆分文件带来很多好处。不只是自己看着方便了,还能方便多人合作开发。如果多人修改一个文件,很容易出现各种问题。每个人负责自己的代码文件,这些文件组成一个项目,这样就不容易造成文件版本上的冲突。

但是,这也带来了新的问题。一个文件依赖另外一个文件的时候,需要通过import来导入。比如:

  1. #import <Foundation/Foundation.h>   
  2. #import "CategoryDemo.h"   
  3. #import "Book.h"   
  4. #import "MusicBook.h"   
  5. #import "PlayMusic.h"  
  6. @class Author;  
  7. int main (int argc, const char * argv[]) {   
  8.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];   
  9.     NSString *message=@"你好,世界!";   
  10.     NSLog(@"%@, 长度为: %i",message,[message length]);   
  11.     [message printHelloInfo];   
  12.     Book *book=[[Book alloc] init]; 

这里main方法中使用了Book类,那么,就需要通过import把它引进来,否则,编译器不知道Book类在哪里。

另外,如果我这样:

  1. #import <Foundation/Foundation.h>   
  2. #import "CategoryDemo.h"   
  3. //#import "Book.h"   
  4. #import "MusicBook.h"   
  5. #import "PlayMusic.h"  
  6. @class Author;  
  7. int main (int argc, const char * argv[]) { 

注释了对Book头文件的导入,系统一样编译通过,而且运行正常。这是怎么回事儿呢?

这是因为编译器很聪明。它发现MusicBook头文件里面已经导入了Book头文件:

  1. #import <Cocoa/Cocoa.h>   
  2. #import "Book.h"   
  3. #import "PlayMusic.h"  
  4.  
  5. @interface MusicBook : Book <PlayMusic>

在上面代码中有一个奇怪的代码:

  1. @class Author; 

有了这句话,该代码中的:

  1. book.author=[[Author alloc]init]; 

就不会报错了。

可以用下面的语句替代@class的代码:

  1. #import "Author.h"   
  2. //@class Author 

;

系统一样会很好的工作。那么,@class和#import有什么区别呢?

这里要说一下头文件依赖关系。如果有100个m文件都导入了某个头文件,那么,当这个头文件改变了内容,则编译器会强制重新编译这100个m文件的。编译的速度可想而知。

@class就是为了避免这样的事情发生的。当编译器看到比如类文件B是通过@class的方式引入一个类文件A,就不会在该类文件A的头文件改动后重新编译B了。

那如果这样,都用@class替代#import吧。问题是,有些情况,只能使用#import。因为有时候编译器不只是需要知道类B引用到类A,还需要知道类A的内部信息,而这些信息是类B需要的。比如类B继承自类A,这时就不能用@class,而只能用#import。

小结:关于了解Objective-C文件组织的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-05 15:56:03

Objective-C 消息 函数

2011-08-01 11:37:41

iPhone Objective- 内存

2011-08-02 15:55:31

Objective-C NSAutorele

2011-08-04 13:55:10

Cocoa Objective- 文件

2011-08-16 13:43:40

Objective-C文件cocoa

2011-08-10 18:07:29

Objective-C反射

2011-05-11 11:20:26

Objective-C

2013-03-27 12:54:00

iOS开发Objective-C

2013-06-20 10:40:32

Objective-C实现截图

2011-05-11 15:58:34

Objective-C

2011-07-26 10:50:50

Objective-C Selector

2011-05-11 15:45:50

内存管理Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-05-11 14:06:49

Objective-C

2011-08-02 13:16:36

Objective-C 语法 函数

2011-08-04 11:15:46

Objective-C 构造函数 构造方法

2011-05-11 13:54:08

Objective-C

2013-08-21 14:57:42

objective-c问题

2011-08-04 09:35:09

Objective-C 编码规范

2011-08-03 16:55:05

Objective-C 代理
点赞
收藏

51CTO技术栈公众号