Effective Objective-C(二)
--
在類的頭文件中盡量少引入其他頭文件
Objective-C中編寫類時候創(chuàng)建兩個文件浩淘,頭文件(.h結(jié)尾)和實(shí)現(xiàn)文件(.m結(jié)尾)。創(chuàng)建一個類例子如下:
//EOCPerson.h
#import <Foundation/Foundation.h>
@interface EOCPerson : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@end
//EOCPerson.m
#import "EOCPerson.h"
@implementation EOCPerson
//
@end
過段時間后,你創(chuàng)建了一個EOCEmlpoyer的新類阔籽,然后想給EOCPerson添加一個屬性
于是有:
@interface EOCPerson : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) EOCEmployer *employer;
@end
并且通常的方法是在EOCPerson.h中加入#import "EOCEmployer.h"
,這種方法可行但是不夠優(yōu)雅扑浸,因?yàn)樵诰幾gEOCPerson類的文件的時候僵蛛,不需要知道EOCEmployer類的全部細(xì)節(jié)壮吩,只需要指導(dǎo)一個類名交EOCEmployer就好檐蚜。于是有個更好的方法來告訴編譯器@class EOCEmployer;
這中方法叫做“向前聲明”(forward declaring)該類蟆技。
當(dāng)在EOCPerson類的實(shí)現(xiàn)文件中玩敏,再引入EOCEmployer類的頭文件,因?yàn)橐涝擃惖乃屑?xì)節(jié)质礼。
將引入頭文件的時機(jī)盡量延后旺聚,只在確實(shí)需要使用的時候才引入,這樣減少類的使用者所引入頭文件的數(shù)量眶蕉。如果例中在EOCPerson.h中引入EOCEmployer.h,那么只要引入EOCPerson就會引入EOCEmployer.h的所有內(nèi)容砰粹,若此過程儲蓄下去,便會引入許多根本用不到的內(nèi)容造挽,顯然會增加了編譯時間碱璃。
向前聲明也解決了兩個類相互引用的問題。假設(shè)要為EOCEmployer類加入新增及刪除雇員的方法饭入,那么在其頭文件中會有一下兩方法:
- (void)addEmployee:(EOCPerson *)person;
- (void)removeEmployee:(EOCPerson *)person;
此時若要編譯EOCEmlpoyee嵌器,則編譯器必須要知道EOCPerson這個類,而如果要編譯EOCPerson則編譯器必須要指導(dǎo)EOCEmployee谐丢。如果在各自頭文件中引入對方的頭文件爽航,則會導(dǎo)致”交叉導(dǎo)入”(chicken-and-eggs situation)。最終會使兩個類中一個無法正確編譯乾忱。