Objective-C官方文檔

  1. 如果要給一個屬性不一樣的訪問方法,需要在property里進(jìn)行指定,如下:
    

@property(getter = isFinished) BOOL finished;

  1. 可以自定義變量名字,需要定義跳轉(zhuǎn)的值,如下:
    @implementation class
    @sythesize propertyName = instanceVarivalbeName
    ….
    @end
  2. 一定要保證weak屬性在被調(diào)用之前不為nil,比如:
    if(self.weakProperty) {….}
  3. Unsafe Unretained: 有些不支持weak的屬性,比如NSTextView,NSFont和NSColorSpace等,使用方法如下:
    @property (unsafe_unretained) NSObject *unsafeProperty;
    NSObject *__unsafe_unretained unsafeReference;
    unsafe 引用 和weak引用類似,但是他在目標(biāo)對象為nil時不會被置為nil。所以有可能存在野指針的情況。
  4. 處理兩個對象時,==操作符表示測試兩個不同指針是否指向同一個對象;
    如果要測試兩個對象是否含有同樣的值,應(yīng)當(dāng)使用 isEqual方法。
  5. 在運行時,通過category添加的方法和通過原始class添加的方法沒有區(qū)別。
  6. 除了可以給現(xiàn)有class添加方法,category也可以用來分割復(fù)雜class的各種實現(xiàn)。
    
  7. 如果一個在category里定義的方法名和原始class或者另一個category中定義的方法名一樣,那么運行時執(zhí)行哪一個方法名的方法就不一定了。
    
  8. 為了防止未定義的行為,最佳實踐是給方法名添加前綴。
    
  9. extension和category功能類似,但是extension只可以給已知源碼的class添加方法。
    
  10. class extension經(jīng)常用來給public class添加private方法或者屬性。 例如,定義一個屬性為readonly在外部,但是內(nèi)部定義該屬性為readwrite,為了內(nèi)部能直接改變屬性值。
    
  11. 和class extension不同,associated reference 不影響原始class的定義和實現(xiàn),所以說即便沒有對原始數(shù)據(jù)的訪問權(quán)限,也可以使用。objc_setAssociatedObject
    
  12. NSArray和NSDictionary只可以用來收集OC對象,其它對象必須封裝在OC對象之內(nèi)才可以init到上述類型之中。
    
  13. NSNumber是一個類簇。意思是當(dāng)你在運行時創(chuàng)建一個實例時,你會得到一個具體的子類來存儲提供的值,就當(dāng)那個對象是NSNumber的子類就好。
    
  14. 在sort的時候:
    a) NSArray類型由于是不可變,所以調(diào)用sort方法會返回一個新的array對象。
    b) Mutable的Array可以直接sort,不需要返回新array
  15. 如果在collection中想表達(dá)”no object”,可以使用NSNull類
  16. 很多collection類實現(xiàn)了NSFastEnumeration協(xié)議,包括NSArray,NSSet和NSDictionary。
  17. 在快速遍歷collection時是不可以修改值的,即便是mutable的變量。如果你打算add或者remove一個對象,會導(dǎo)致一個運行時異常。
  18. 通過反復(fù)調(diào)用nextObject也可以遍歷所有內(nèi)容,比如:while((eachObject = [enumerator nextObject])){……}
  19. 如果真的想在條件處賦值,則需要將賦值語句加括號,比如:if((someVar = YES))
  20. 用快速遍歷比收工用遍歷對象要快。
  21. 如果在block之后修改了block內(nèi)部讀取的值,因為該值被capture了,所以在block生效時不會收影響。比如:int value = 42;void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 42 while extvalue = 84;testBlock();
  22. 如果想改變block中的引用值,需要用__block標(biāo)志。這時候該值的生命周期在block內(nèi)外都是有效的。__block int value = 42;void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 84 while extvalue = 84;testBlock();
  23. block類型應(yīng)當(dāng)設(shè)置其類型為copy,因為block需要copy以保證保持原始調(diào)用域的環(huán)境。不過在ARC下不需要考慮這個問題,因為block自動會以copy形式定義。
  24. 下述方法遍歷每一個鍵值對更加方便:NSDictionary *dict = …[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj,BOOL *stop){ NSLog(“key:%@,value:%@”,key,object);}
  25. 創(chuàng)建NSError時,需要定義自己的errorDomain,應(yīng)該形式如下:com.companyName.appOrFrameworkName.ErrorDomain創(chuàng)建完整的Error如下:NSString *domain = @”com.MyCompany.MyApplication.ErrorDomain”;NSString *desc = NSLocalizedString(@”Unable to…”,@””);NSDictionary *userInfo = @{NSLocalizedDescriptionKey:desc};NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];
  26. 自定義類應(yīng)當(dāng)使用三個字母的前綴。命名最好用名詞,以表示所指,例如:NSWindow, CAAnimation等
  27. 如果method需要一個或多個參數(shù),方法名需要暗示出每一個參數(shù),比如:subStringFromIndex: writeToUrl:
  28. 方法名的第一部分應(yīng)當(dāng)暗示方法的主要意圖或者方法的返回值。如果返回值很重要,可以用復(fù)合詞,比如mutableCopy. 如果一個方法返回一個action,第一個單詞應(yīng)當(dāng)暗示那個action,例如write…或者enumerate…
  29. 如果一個方法需要傳入error參數(shù),此參數(shù)應(yīng)該排在最后;如果一個方法含有block,block應(yīng)當(dāng)排在最后,為了使得方法名在調(diào)用時盡量處于統(tǒng)一行,方便可讀。因此盡量在方法中少包含block變量。
  30. 少寫縮寫。
  31. 工廠類方法在創(chuàng)建時應(yīng)當(dāng)以類名字作為開頭(無前綴),除非類的子類存在相同的工廠方法了。例如 [NSMutableArray array];
最后編輯于
?著作權(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)容