OC編程筆記

  1. 如果要給一個(gè)屬性不一樣的訪問(wèn)方法,需要在property里進(jìn)行指定,如下:
    @property(getter = isFinished) BOOL finished;

  2. 可以自定義變量名字,需要定義跳轉(zhuǎn)的值,如下:
    @implementation class
    @sythesize propertyName = instanceVarivalbeName
    ….
    @end

  3. 一定要保證weak屬性在被調(diào)用之前不為nil,比如:
    if(self.weakProperty) {….}

  4. Unsafe Unretained: 有些不支持weak的屬性,比如NSTextView,NSFont和NSColorSpace等,使用方法如下:
    @property (unsafe_unretained) NSObject *unsafeProperty;
    NSObject *__unsafe_unretained unsafeReference;
    unsafe 引用 和weak引用類似,但是他在目標(biāo)對(duì)象為nil時(shí)不會(huì)被置為nil。所以有可能存在野指針的情況。

  5. 處理兩個(gè)對(duì)象時(shí),==操作符表示測(cè)試兩個(gè)不同指針是否指向同一個(gè)對(duì)象;
    如果要測(cè)試兩個(gè)對(duì)象是否含有同樣的值,應(yīng)當(dāng)使用 isEqual方法。

  6. 在運(yùn)行時(shí),通過(guò)category添加的方法和通過(guò)原始class添加的方法沒有區(qū)別。

  7. 除了可以給現(xiàn)有class添加方法,category也可以用來(lái)分割復(fù)雜class的各種實(shí)現(xiàn)。

  8. 如果一個(gè)在category里定義的方法名和原始class或者另一個(gè)category中定義的方法名一樣,那么運(yùn)行時(shí)執(zhí)行哪一個(gè)方法名的方法就不一定了。

  9. 為了防止未定義的行為,最佳實(shí)踐是給方法名添加前綴。

  10. extension和category功能類似,但是extension只可以給已知源碼的class添加方法。

  11. class extension經(jīng)常用來(lái)給public class添加private方法或者屬性。 例如,定義一個(gè)屬性為readonly在外部,但是內(nèi)部定義該屬性為readwrite,為了內(nèi)部能直接改變屬性值。

  12. 和class extension不同,associated reference 不影響原始class的定義和實(shí)現(xiàn),所以說(shuō)即便沒有對(duì)原始數(shù)據(jù)的訪問(wèn)權(quán)限,也可以使用。
    objc_setAssociatedObject

  13. NSArray和NSDictionary只可以用來(lái)收集OC對(duì)象,其它對(duì)象必須封裝在OC對(duì)象之內(nèi)才可以init到上述類型之中。

  14. NSNumber是一個(gè)類簇。意思是當(dāng)你在運(yùn)行時(shí)創(chuàng)建一個(gè)實(shí)例時(shí),你會(huì)得到一個(gè)具體的子類來(lái)存儲(chǔ)提供的值,就當(dāng)那個(gè)對(duì)象是NSNumber的子類就好。

  15. 在sort的時(shí)候:
    a) NSArray類型由于是不可變,所以調(diào)用sort方法會(huì)返回一個(gè)新的array對(duì)象。
    b) Mutable的Array可以直接sort,不需要返回新array

  16. 如果在collection中想表達(dá)”no object”,可以使用NSNull類

  17. 很多collection類實(shí)現(xiàn)了NSFastEnumeration協(xié)議,包括NSArray,NSSet和NSDictionary。

  18. 在快速遍歷collection時(shí)是不可以修改值的,即便是mutable的變量。如果你打算add或者remove一個(gè)對(duì)象,會(huì)導(dǎo)致一個(gè)運(yùn)行時(shí)異常。

  19. 通過(guò)反復(fù)調(diào)用nextObject也可以遍歷所有內(nèi)容,比如:
    while((eachObject = [enumerator nextObject])){……}

  20. 如果真的想在條件處賦值,則需要將賦值語(yǔ)句加括號(hào),比如:
    if((someVar = YES))

  21. 用快速遍歷比手工用遍歷對(duì)象要快。

  22. 如果在block之后修改了block內(nèi)部讀取的值,因?yàn)樵撝当籧apture了,所以在block生效時(shí)不會(huì)收影響。比如:
    int value = 42;
    void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 42 while ext
    value = 84;
    testBlock();

  23. 如果想改變block中的引用值,需要用__block標(biāo)志。這時(shí)候該值的生命周期在block內(nèi)外都是有效的。
    __block int value = 42;
    void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 84 while ext
    value = 84;
    testBlock();

  24. block類型應(yīng)當(dāng)設(shè)置其類型為copy,因?yàn)閎lock需要copy以保證保持原始調(diào)用域的環(huán)境。不過(guò)在ARC下不需要考慮這個(gè)問(wèn)題,因?yàn)閎lock自動(dòng)會(huì)以copy形式定義。

  25. 下述方法遍歷每一個(gè)鍵值對(duì)更加方便:
    NSDictionary *dict = …
    [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj,BOOL *stop)
    {
    NSLog(“key:%@,value:%@”,key,object);
    }

  26. 創(chuàng)建NSError時(shí),需要定義自己的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];

  27. 自定義類應(yīng)當(dāng)使用三個(gè)字母的前綴。命名最好用名詞,以表示所指,例如:NSWindow, CAAnimation等

  28. 如果method需要一個(gè)或多個(gè)參數(shù),方法名需要暗示出每一個(gè)參數(shù),比如:
    subStringFromIndex: writeToUrl:

  29. 方法名的第一部分應(yīng)當(dāng)暗示方法的主要意圖或者方法的返回值。如果返回值很重要,可以用復(fù)合詞,比如mutableCopy. 如果一個(gè)方法返回一個(gè)action,第一個(gè)單詞應(yīng)當(dāng)暗示那個(gè)action,例如write…或者enumerate…

  30. 如果一個(gè)方法需要傳入error參數(shù),此參數(shù)應(yīng)該排在最后;如果一個(gè)方法含有block,block應(yīng)當(dāng)排在最后,為了使得方法名在調(diào)用時(shí)盡量處于統(tǒng)一行,方便可讀。因此盡量在方法中少包含block變量。

  31. 少寫縮寫。

  32. 工廠類方法在創(chuàng)建時(shí)應(yīng)當(dāng)以類名字作為開頭(無(wú)前綴),除非類的子類存在相同的工廠方法了。例如 [NSMutableArray array];

  33. 只要見到mutable就是深拷貝。
    列表:

[immutableObject copy]//淺copy
[immutableObject mutableCopy]//單層深copy

[mutableObject copy]//單層深copy
[mutableObject mutableCopy]//單層深copy

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

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

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