Effective Objective-C(二)

Effective Objective-C(二)

--

在類的頭文件中盡量少引入其他頭文件

Objective-C中編寫類時候創(chuàng)建兩個文件,頭文件(.h結尾)和實現(xiàn)文件(.m結尾)。創(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)雅,因為在編譯EOCPerson類的文件的時候,不需要知道EOCEmployer類的全部細節(jié),只需要指導一個類名交EOCEmployer就好。于是有個更好的方法來告訴編譯器@class EOCEmployer;這中方法叫做“向前聲明”(forward declaring)該類。
當在EOCPerson類的實現(xiàn)文件中,再引入EOCEmployer類的頭文件,因為要知道該類的所有細節(jié)。
將引入頭文件的時機盡量延后,只在確實需要使用的時候才引入,這樣減少類的使用者所引入頭文件的數(shù)量。如果例中在EOCPerson.h中引入EOCEmployer.h,那么只要引入EOCPerson就會引入EOCEmployer.h的所有內容,若此過程儲蓄下去,便會引入許多根本用不到的內容,顯然會增加了編譯時間。
向前聲明也解決了兩個類相互引用的問題。假設要為EOCEmployer類加入新增及刪除雇員的方法,那么在其頭文件中會有一下兩方法:

- (void)addEmployee:(EOCPerson *)person;
- (void)removeEmployee:(EOCPerson *)person;

此時若要編譯EOCEmlpoyee,則編譯器必須要知道EOCPerson這個類,而如果要編譯EOCPerson則編譯器必須要指導EOCEmployee。如果在各自頭文件中引入對方的頭文件,則會導致”交叉導入”(chicken-and-eggs situation)。最終會使兩個類中一個無法正確編譯。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容