代碼組織

來自 Mattt Thompson

code organization is a matter of hygiene (代碼組織是衛(wèi)生問題)

利用代碼塊

一個 GCC 非常模糊的特性,以及 Clang 也有的特性是,代碼塊如果在閉合的圓括號內(nèi)的話,會返回最后語句的值
NSURL *url = ({
    NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint]; 
    [NSURL URLWithString:urlString];
});

Pragma

Pragma Mark

<pre>#pragma mark - 是一個在類內(nèi)部組織代碼并且?guī)椭惴纸M方法實現(xiàn)的好辦法。 我們建議使用 #pragma mark - 來分離:
</pre>

· 不同功能組的方法
· protocols 的實現(xiàn)
· 對父類方法的重寫
- (void)dealloc { /* ... */ }
- (instancetype)init { /* ... */ }
#pragma mark - View Lifecycle (View 的生命周期)
- (void)viewDidLoad { /* ... */ }
- (void)viewWillAppear:(BOOL)animated { /* ... */ }
- (void)didReceiveMemoryWarning { /* ... */ }
#pragma mark - Custom Accessors (自定義訪問器)
- (void)setCustomProperty:(id)value { /* ... */ }
- (id)customProperty { /* ... */ }
#pragma mark - IBActions 
- (IBAction)submitData:(id)sender { /* ... */ }
#pragma mark - Public
- (void)publicMethod { /* ... */ }
#pragma mark - Private
- (void)zoc_privateMethod { /* ... */ }
#pragma mark - UITableViewDataSource
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { /* ... */ }
#pragma mark - ZOCSuperclass
// ... 重載來自 ZOCSuperclass 的方法
#pragma mark - NSObject
- (NSString *)description { /* ... */ }

上面的標記能明顯分離和組織代碼。你還可以用 cmd+Click 來快速跳轉(zhuǎn)到符號定義地方。 但是小心,即使 paragma mark 是一門手藝,但是它不是讓你類里面方法數(shù)量增加的一個理由:類里面有太多方法說明類做了太多事情,需要考慮重構(gòu)了。

關(guān)于 pragma

http://raptureinvenice.com/pragmas-arent-just-for-marks/ 有很好的關(guān)于 pragma 的討論了,在這邊我們再做部分說明。
大多數(shù) iOS 開發(fā)者平時并沒有和很多編譯器選項打交道。一些選項是對控制嚴格檢查(或者不檢查)你的代碼或者錯誤的。有時候,你想要用 pragma 直接產(chǎn)生一個異常,臨時打斷編譯器的行為。
當你使用ARC的時候,編譯器幫你插入了內(nèi)存管理相關(guān)的調(diào)用。但是這樣可能產(chǎn)生一些煩人的事情。比如你使用NSSelectorFromString來動態(tài)地產(chǎn)生一個 selector 調(diào)用的時候,ARC不知道這個方法是哪個并且不知道應該用那種內(nèi)存管理方法,你會被提示 performSelector may cause a leak because its selector is unknown(執(zhí)行 selector 可能導致泄漏,因為這個 selector 是未知的).
如果你知道你的代碼不會導致內(nèi)存泄露,你可以通過加入這些代碼忽略這些警告

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"[myObjperformSelector:mySelector withObject:name];
#pragma clang diagnostic pop

注意我們是如何在相關(guān)代碼上下文中用 pragma 停用 -Warc-performSelector-leaks 檢查的。這確保我們沒有全局禁用。如果全局禁用,可能會導致錯誤。
全部的選項可以在 The Clang User's Manual 找到并且學習。

忽略沒用使用變量的編譯警告

告訴你申明的變量它將不會被使用,這種做法很有用。大多數(shù)情況下,你希望移除這些引用來(稍微地)提高性能,但是有時候你希望保留它們。為什么?或許它們以后有用,或者有些特性只是暫時移除。無論如何,一個消除這些警告的好方法是用相關(guān)語句進行注解,使用 #pragma unused():

- (NSInteger)giveMeFive
{ 
  NSString *foo; 
  #pragma unused (foo) 
  return 5;
}

現(xiàn)在你的代碼不用任何編譯警告了。注意你的 pragma 需要標記到問題代碼之下。

明確編譯器警告和錯誤

編譯器是一個機器人,它會標記你代碼中被 Clang 規(guī)則定義為錯誤的地方。但是,你總是比 Clang 更聰明。通常,你會發(fā)現(xiàn)一些討厭的代碼會導致這個問題,但是暫時卻解決不了。你可以這樣明確一個錯誤:

- (NSInteger)divide:(NSInteger)dividend by:(NSInteger)divisor
{
   #error Whoa, buddy, you need to check for zero here! 
   return (dividend / divisor);
}

類似的,你可以這樣標明一個警告

- (float)divide:(float)dividend by:(float)divisor
{
   #warning Dude, don't compare floating point numbers like this!
   if (divisor != 0.0) {
     return (dividend / divisor); 
   }
   else { 
     return NAN;
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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