Objective-C代碼規(guī)范

if語句

命名

通用的約定

推薦使用長的、描述性的方法和常量
常量使用駝峰式的命名規(guī)范,有時為了清晰,加上所在的類名

Initializer 和 dealloc 初始化

推薦的代碼組織方式:將 dealloc 方法放在實(shí)現(xiàn)文件的最前面(直接在 @synthesize 以及 @dynamic 之后),init 應(yīng)該放在 dealloc 之后。如果有多個初始化方法, designated initializer 應(yīng)該放在第一個,secondary initializer 在之后緊隨,這樣邏輯性更好。
如今有了 ARC,dealloc 方法幾乎不需要實(shí)現(xiàn),不過把 init 和 dealloc 放在一起可以從視覺上強(qiáng)調(diào)它們是一對的。通常,在 init 方法中做的事情需要在 dealloc 方法中撤銷。

alloc 、 init分別是申請內(nèi)存和初始化,Objective-C的特性兩步創(chuàng)建

  • alloc表示對象分配內(nèi)存,這個過程涉及分配足夠的可用內(nèi)存來保存對象,寫入isa指針,初始化 retain 的計數(shù),并且初始化所有實(shí)例變量。
  • init 是表示初始化對象,這意味著把對象放到了一個可用的狀態(tài)。這通常是指把對象的實(shí)例變量賦給了可用的值。

Designated 和 Secondary Initializers

Objective-C 有 designated 和 secondary 初始化方法的觀念。
designated 初始化方法是提供所有的參數(shù),secondary 初始化方法是一個或多個,并且提供一個或者更多的默認(rèn)參數(shù)來調(diào)用 designated 初始化方法的初始化方法。

Designated Initializer

一個類應(yīng)該又且只有一個 designated 初始化方法,其他的初始化方法應(yīng)該調(diào)用這個 designated 的初始化方法(雖然這個情況有一個例外)

在類繼承中調(diào)用任何 designated 初始化方法都是合法的,而且應(yīng)該保證 所有的 designated initializer 在類繼承中是是從祖先(通常是 NSObject)到你的類向下調(diào)用的。
實(shí)際上這意味著第一個執(zhí)行的初始化代碼是最遠(yuǎn)的祖先,然后從頂向下的類繼承,所有類都有機(jī)會執(zhí)行他們特定的初始化代碼。這樣,你在你做你的特定的初始化工作前,所有你從超類繼承的東西是不可用的狀態(tài)。即使它的狀態(tài)不明確,所有 Apple 的框架的 Framework 是保證遵守這個約定的,而且你的類也應(yīng)該這樣做。

當(dāng)定義一個新類的時候有三個不同的方式:

  1. 不需要重載任何初始化函數(shù)
  2. 重載 designated initializer
  3. 定義一個新的 designated initializer

在你希望提供你自己的初始化函數(shù)的時候,你應(yīng)該遵守這三個步驟來保證正確的性:

  1. 定義你的 designated initializer,確保調(diào)用了直接超類的 designated initializer
  2. 重載直接超類的 designated initializer。調(diào)用你的新的 designated initializer.
  3. 為新的 designated initializer 寫文檔

確保在定義新的designated initializer時,必須重載父類的designated initializer,否則會出現(xiàn)調(diào)用者使用父類的designated initializer,從而導(dǎo)致沒有初始化成功子類
上述的一個推論是:你應(yīng)該永遠(yuǎn)不從 designated initializer 里面調(diào)用一個 secondary initializer (如果secondary initializer 遵守約定,它會調(diào)用 designated initializer)。如果這樣,調(diào)用很可能會調(diào)用一個子類重寫的 init 方法并且陷入無限遞歸之中

可以使用__attribute__來標(biāo)示

初始化模式

類簇 (class cluster)[抽象工廠]

an architecture that groups a number of private, concrete subclasses under a public, abstract superclass. (一個在共有的抽象超類下設(shè)置一組私有子類的架構(gòu))

這個模式非常有用,因?yàn)樗鼫p少了構(gòu)造器調(diào)用中的復(fù)雜性,只需要知道接口如何與對象通信,而不需要知道怎么實(shí)現(xiàn)。

Class clusters 在 Apple 的Framework 中廣泛使用:一些明顯的例子比如 NSNumber 可以返回不同哦給你的子類,取決于 數(shù)字類型如何提供 (Integer, Float, etc...) 或者 NSArray 返回不同的最優(yōu)存儲策略的子類。

The beauty of this pattern is that the caller can be completely unaware of the concrete subclass; in fact it can be used when designing a library to be able to swap the underlaying returned class without leaking any implementation detail as long as is respectful of the contract established in the abstract class.

這個模式的精妙的地方在于,調(diào)用者可以完全不管子類,事實(shí)上,這可以用在設(shè)計一個庫,可以用來交換實(shí)際的返回的類,而不用去管相關(guān)的細(xì)節(jié),因?yàn)樗鼈兌甲駨某橄蟪惖姆椒ā?/p>

我們的經(jīng)驗(yàn)是使用類簇可以幫助移除很多條件語句。

@implementation ZOCKintsugiPhotoViewController

- (id)initWithPhotos:(NSArray *)photos
{
    if ([self isMemberOfClass:ZOCKintsugiPhotoViewController.class]) {
        self = nil;

        if ([UIDevice isPad]) {
            self = [[ZOCKintsugiPhotoViewController_iPad alloc] initWithPhotos:photos];
        }
        else {
            self = [[ZOCKintsugiPhotoViewController_iPhone alloc] initWithPhotos:photos];
        }
        return self;
    }
    return [super initWithNibName:nil bundle:nil];
}

@end

屬性定義

推薦按照下面的格式來定義屬性

@property (nonatomic, readwrite, copy) NSString *name;

屬性的參數(shù)應(yīng)該按照下面的順序排列: 原子性,讀寫 和 內(nèi)存管理。 這樣做你的屬性更容易修改正確,并且更好閱讀。

你必須使用 nonatomic,除非特別需要的情況。在iOS中,atomic帶來的鎖特別影響性能。

屬性可以存儲一個代碼塊。為了讓它存活到定義的塊的結(jié)束,必須使用 copy (block 最早在棧里面創(chuàng)建,使用 copy讓 block 拷貝到堆里面去)

為了完成一個共有的 getter 和一個私有的 setter,你應(yīng)該聲明公開的屬性為 readonly 并且在類擴(kuò)展總重新定義通用的屬性為 readwrite 的。

@interface MyClass : NSObject
@property (nonatomic, readonly) NSObject *object
@end

@implementation MyClass ()
@property (nonatomic, readwrite, strong) NSObject *object
@end

如果 BOOL 屬性的名字是描述性的,這個屬性可以省略 "is" ,但是特定要在 get 訪問器中指定名字,如:

@property (assign, getter=isEditable) BOOL editable;

文字和例子是引用 Cocoa Naming Guidelines.

為了避免 @synthesize 的使用,在實(shí)現(xiàn)文件中,Xcode已經(jīng)自動幫你添加了。

私有屬性

私有屬性應(yīng)該在類實(shí)現(xiàn)文件的類拓展(class extensions,沒有名字的 categories 中)中。有名字的 categories(如果 ZOCPrivate)不應(yīng)該使用,除非拓展另外的類。

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容