ObjC: 源文件的组织
来源:互联网 发布:.net编程委托有什么用 编辑:程序博客网 时间:2024/04/30 15:40
最简单的ObjC程序,你都可以这样写:
#import <Foundation/Foundation.h>
@interface Book : NSObject{
}-(NSString *) getPrice;
@end
@implementation Book
-(NSString *) getPrice{
return @"$17";
}@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];Book *book=[[Book alloc] init];
NSLog(@"Book price: %@",[book getPrice]);
[pool drain];
return 0;
}
理论上讲,按照上面的写法,你可以把所有的代码都写在一个文件里。
但是问题是,你不便于维护这个代码。代码很长,很乱。
所以,一般有以下几种形式来拆分和组织代码:
- 类文件拆分为头文件和m文件
- 使用组的概念来管理文件
拆分接口和实现部分
拆分h文件和m文件很好理解。只要使用Xcode做开发,通过向导页面创建类,文件默认情况下就是强制分开的:
使用组的概念管理文件
使用组的概念。在Xcode下面,程序源文件都是放在Source目录下的,在该目录下,可以进一步创建“目录”,把不同用途的源文件分类放置。这样就如同桌上凌乱的书归置到书架里一样。很好查找和查阅。
可以看到,下面是把Book相关的一些类放在book组中了。
这个组看起来是目录,但如果你打开finder,查看目录结构,发现并不存在这样的目录:
拆分文件带来的问题及解决办法
拆分文件带来很多好处。不只是自己看着方便了,还能方便多人合作开发。如果多人修改一个文件,很容易出现各种问题。每个人负责自己的代码文件,这些文件组成一个项目,这样就不容易造成文件版本上的冲突。
但是,这也带来了新的问题。一个文件依赖另外一个文件的时候,需要通过import来导入。比如:
#import <Foundation/Foundation.h>
#import "CategoryDemo.h"
#import "Book.h"
#import "MusicBook.h"
#import "PlayMusic.h"@class Author;
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *message=@"你好,世界!";
NSLog(@"%@, 长度为: %i",message,[message length]);
[message printHelloInfo];
Book *book=[[Book alloc] init];
这里main方法中使用了Book类,那么,就需要通过import把它引进来,否则,编译器不知道Book类在哪里。
另外,如果我这样:
#import <Foundation/Foundation.h>
#import "CategoryDemo.h"
//#import "Book.h"
#import "MusicBook.h"
#import "PlayMusic.h"@class Author;
int main (int argc, const char * argv[]) {
注释了对Book头文件的导入,系统一样编译通过,而且运行正常。这是怎么回事儿呢?
这是因为编译器很聪明。它发现MusicBook头文件里面已经导入了Book头文件:
#import <Cocoa/Cocoa.h>
#import "Book.h"
#import "PlayMusic.h"@interface MusicBook : Book <PlayMusic>{
在上面代码中有一个奇怪的代码:
@class Author;
有了这句话,该代码中的:
book.author=[[Author alloc]init];
就不会报错了。
可以用下面的语句替代@class的代码:
#import "Author.h"
//@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。
- ObjC: 源文件的组织
- ObjC: 源文件的组织
- 源文件组织
- 外部连接,内部连接,源文件的组织
- Linux源文件的组织结构-转
- 多个源文件的组织编译
- 探索应用开发的基础之android源文件的组织
- 4.复合与源文件组织
- 面向项目(十)—— 头文件、源文件的组织
- OC基础回顾 (五)源文件组织
- ObjC的委托
- objc的类加载
- objc 的新特性
- objc 的ARC
- objc category的秘密
- -ObjC的作用
- Xcode里的-ObjC
- Cocos2d-ObjC的Action
- VC CComboBox用法
- T-SQL查询进阶--变量
- 结构体练习
- 类成员变量的赋值与初始化
- C++ inline 函数
- ObjC: 源文件的组织
- WakeLock使用笔记
- android4.0 编译报错 Xmx2048m错误
- oracle 日期比较
- 给Dtree添加Checkbox
- win7下如何启用telnet功能及其回显功能
- 菜鸟笔记——8月16日
- 使用AStyle格式化源代码
- python解析xml