第一次讀這本書是在剛剛接觸iOS開發(fā)的時候诅愚,那時的我沒有一點開發(fā)經驗李破,書中的很多內容都只是一知半解,甚至有所忽略垫蛆。半年多的時間過去了禽最,有些許開發(fā)經驗的我再來讀這本書,又有了很多收獲袱饭,因此便有了這篇“再讀”筆記川无。
第六章源文件組織
- 一個文件在接口部分存放的代碼包括
- 類的@interface指令:聲明繼承關系
- 公共struct定義
- enum常量
- define定義
- extern全局變量
第八章Foundation Kit介紹
- NSArray只能存儲OC對象,不能存儲
- C語言的基礎數據類型虑乖,如int懦趋,float,enum疹味,struct
- OC的基礎數據類型仅叫,如NSInteger,NSUInteger糙捺,CGFloat
- nil
- 可以通過NSNumber類將OC的基礎數據類型轉化為對象存儲在NSArray中诫咱,簡易的寫法為@()。
- NSArray可以通過字面量語法創(chuàng)建洪灯,并且在結尾處不用補上nil坎缭。但是作為NSArray子類的NSMutableArray卻沒有字面量語法來創(chuàng)建起對象。
- 判斷數組內是否包含某一對象有兩種常用方法:
- (BOOL)containsObject:(ObjectType)anObject ;
-
- (NSUInteger)indexOfObject:(ObjectType)anObject ; //若返回值為NSNotFound签钩,則說明不包含該對象
上述兩個方法都是建立在對象的-(BOOL)isEqual:
方法之上的掏呼。
- 當要讀取的key值在NSDictionary對象中不存在時會返回nil。
第十章對象初始化
- BOOL類型變量初始化為NO铅檩;int類型變量初始化為0哄尔;float類型變量初始化為0.0;指針對象初始化為nil柠并。
- 如果創(chuàng)建了一個指定初始化函數岭接,則一定要在該初始化函數中調用超類的指定初始化函數富拗。
- 如果初始化函數不止一個,則需要選擇一個作為指定初始化函數鸣戴。被選定的方法應該調用超類的指定初始化函數啃沪,其它初始化函數按照該指定初始化函數的形式來實現(xiàn)。
第十一章屬性
- 屬性的默認特性為(atomic, assign, readwrite)窄锅。
- 當屬性為只讀時创千,編譯器只會自動生成getter方法,而不會自動生成setter方法入偷。此時如果不定義setter方法追驴,就無法通過點語法進行賦值,可以通過以下代碼解決該問題疏之。
#import <Foundation/Foundation.h>
@interface BaseClass : NSObject
@property (nonatomic, copy,readonly) NSString *name ;
- (void)setName:(NSString *)name ;
@end
#import "BaseClass.h"
@implementation BaseClass
@synthesize name=_name ;
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release] ;
_name = [name copy] ;
}
}
@end
- 如果同時重寫了屬性的setter方法和getter方法殿雪,那么編譯器將不會將屬性的名稱與支持屬性的實例變量名相關聯(lián),此時需添加代碼
@synthesize name=_name ;
锋爪。
第十二章類別
- 類別的局限性
- 無法向類中添加新的實例變量
- 當方法名稱發(fā)生沖突時丙曙,類別具有更高的優(yōu)先級
- 類別的優(yōu)勢
- 將類的實現(xiàn)代碼分散到多個不同文件或框架中
- 創(chuàng)建對私有方法的前向引用:只要知道對象支持的某個方法的名稱,即使該對象所在類的接口中并沒有聲明該方法也可以調用其骄。不過這么做編譯器會報錯亏镰,但是可以通過新建一個該類的類別并且在該類別的.h文件中聲明原始類的該私有方法來解決該問題
- 創(chuàng)建一個NSObject的類別來向對象添加非正式協(xié)議
- 類擴展
- 不需要名字
- 在包含源代碼的類中使用它
- 添加實例變量
- 可以將只讀權限改為可讀寫權限
- 創(chuàng)建數量不限
第十四章代碼塊和并發(fā)性
使用block進行回調時要注意循環(huán)引用問題:如果A創(chuàng)建并引用了B,B引用了callBackBlock拯爽,而callBackBlock中又引用了A索抓,就會形成循環(huán)引用。解決方法是使用弱引用來解除這個循環(huán):
__weak A *weakSelf = self
-
連續(xù)隊列
- 當一連串的任務需要按照一定的順序執(zhí)行時可以使用連續(xù)隊列
- 任務執(zhí)行順序為先入先出
- 可創(chuàng)建任意數量的連續(xù)隊列毯炮,它們并行操作任務
- 串行執(zhí)行后臺任務纸兔,主要用于處理耗時比較長的方法,譬如下載否副,安裝汉矿,刪除等
- 代碼示例
dispatch_queue_t serialQueue = dispatch_queue_create("com.apress.mySerialQueue", nil) ;
-
并發(fā)隊列
- 適用于那些可以并行運行的任務
- 遵從先入先出的規(guī)范,且任務可以在前一個任務結束前就開始執(zhí)行
- 系統(tǒng)提供了四種全局隊列备禀,這些隊列僅僅通過優(yōu)先級加以區(qū)別洲拇。因為存在隊列的優(yōu)先級,所以那些在高優(yōu)先級隊列中的任務會比在默認或低優(yōu)先級隊列中的任務先執(zhí)行曲尸,而默認級別隊列的優(yōu)先級又高于低優(yōu)先級隊列赋续。被設置成后臺級別的隊列,它會等待所有比它級別高的隊列中的任務執(zhí)行完或CPU空閑的時候才會執(zhí)行自己的任務
- 后臺執(zhí)行非UI操作
- 代碼示例
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) ;
dispatch_queue_t concurrentQueue = dispatch_queue_create(“com.appress.myConcurrentQueue”,DISPATCH_QUEUE_CONCURRENT) ;
-
主隊列
- 執(zhí)行的是應用程序的主線程任務
- 使用
dispatch_get_main_queue()
可以訪問與應用程序主線程相關的連續(xù)隊列 - 在一個并發(fā)隊列上完成任務后更新UI的一般選擇另患,譬如頁面push纽乱,pull
-
添加任務
- 同步:同步添加任務到隊列后,被添加的任務會阻塞當前線程昆箕,直到這些任務執(zhí)行完
- 異步:異步添加任務到隊列中后會立即返回鸦列,不必等待任務完成租冠。任務會在之后由GCD決定執(zhí)行
- 通過代碼塊添加任務:異步添加
dispatch_async
,同步添加dispatch_sync
第十七章文件加載與保存
- 采用NSCoding協(xié)議的對象通過實現(xiàn)
-encodeWithCoder:
和-initWithCoder:
這兩個方法來實現(xiàn)序列化與反序列化薯嗤,完成與NSData之間的轉換顽爹。 -
-initWithCoder:
和其他init
方法一樣,在為對象執(zhí)行操作之前骆姐,需要使用超類進行初始化镜粤。可以采用兩種方式玻褪,具體取決于父類肉渴。如果父類采用了NSCoding協(xié)議,則應該調用[super initWithCoder:decoder]
带射,否則只需要調用[super init]
同规。
第十八章鍵/值編碼
- 可以通過
-valueForKey:
和-setValue:forKey:
兩個方法設置和訪問對象的屬性。 -
-valueForKey
方法會首先查找以參數命名(格式為-key或-isKey)的getter
方法庸诱,如果沒有這樣的getter
方法將會在對象內尋找名稱格式為_key或key的實例變量。 -
-setValueForKey
方法會自動將標量值從相應的對象中取出:
[car setValue:[NSNumber numberWithFloat:2000.0] forKey:@“weight”] ; //屬性weight類型為float
-
-valueForKey
方法會自動將標量值(int晤揣、float和struct
)放入NSNumber
和NSValue
中:
[car valueForKey:@“modelYear”] ;//屬性modelYEar類型為int
- 批處理
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys ;
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues ;
-
<null>
是一種[NSNull null]
對象桥爽,而(null)
是一個真正的nil
值。
第二十章NSPredicate
- 創(chuàng)建謂詞:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@“SELF….”, string] ;
- 計算謂詞:
BOOL match = [predicate evaluateWithObject:object] ;
- 過濾數組內容:
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate ;