本文旨在總結iOS知識網路,知識點,該知識網路羅列出常見UIKit、Foundation的物件特點和一些使用經驗,可以看成是一本書;文字編輯採用樹的形式,對知識點進行羅列,並標註一些使用經驗(★)希望對初學者有用或給一些解決疑難雜症者提供思路;某些知識點會深入探討;通過總結希望站在一個較高平臺的角度全觀Objective-C。
知識樹中有些是原創文章,有些則是轉載網路上iOS大神的文章。由於篇幅的限制筆者會簡潔地介紹各個知識點,讀者可通過連結瞭解詳情。當然一個人的知識面是相當有限的,在給各位讀者提供知識參考的同時,歡迎大家對本文提意見。
/->UIViewController
| ViewController在iOS只是一個非常重要的概念,其在一個App中所扮演的角色:
| (1) View Management:管理View (2) Data Marshalling:管理資料
| (3) User Interactions:響應使用者互動 (4) Resource Management:管理資源
| (5) Adaptivity:適配不同的螢幕尺寸空間的變化
| ★ 生命週期【一片楓葉點選 另外一篇點選】
| + (void)initialize +(void)load 的呼叫時機,區別【點選】
| ViewDidLoad呼叫時機:當view被首次使用的時候,某些情況可提升效能
| 橫豎屏的坑【點選】。APP整體是豎屏,單個controller可以是橫屏的
| ★ 兩種互動方式:push和present
| 左右滑動 – (void)pushViewController:(UIViewController *) animated:(BOOL)
| 模態,從下往上彈出 – (void)presentViewController:(UIViewController *) animated: (BOOL) completion:
| ★還有一種:直接把Controller的view新增到另一個Controller上。
|-> UIView
| frame 和bound 的區別【點選】
| frame 是相對父試圖座標的值; bound是本身座標系統的值
| layoutSubviews【點選】 需要將[super layoutSubviews];放到最後,不然iOS7有可能會有這個崩潰
| ★ “Auto Layout still required after executing -layoutSubviews” iOS7上崩潰sdk缺陷 【點選】
| 每一個檢視有唯一的父檢視【點選】。addsubview操作把它從上一個父試圖中移除
| 善於使用hidden 使用animateWithDuration簡單地控制頁面切換效果
| 使用animateWithDuration簡單地控制頁面切換效果【點選】
| ★簡單動畫 animateWithDuration【點選】
|->CALayer
| CALayer是個簡單的類,它是用來在螢幕上顯示內容展示的矩形區域.【容芳志出品點選】
| 直接從NSObject繼承,少了UIResponder類,固CALayer悲催的不能響應任何使用者事件【點選】
|-> UIWindow
| 每一個IOS程式都有一個UIWindow
| UIWindow有三個層級,分別是Normal,StatusBar,Alert【點選】
| keyWindow是指定的用來接收鍵盤以及非觸控類的訊息,
| 而且程式中每一個時刻只能有一個window是keyWindow。
|-> UIImage
| 載入圖片幾種方式【點選】
| [UIImage imageNamed:@“xxx”] 系統快取到cache中
| [UIImage imageWithContentsOfFile:path] 不快取
| [UIImage imageWithData:data] 不快取
| ★ 拉伸圖片,四角保持不變 resizableImageWithCapInsets:
| ★ 載入gif圖片【點選】
|-> UILabel【點選】
| 沒有上下居中對齊,可以使用TTTAttributedLabel
| ★ 重寫drawTextInRect:方法,可以自定義繪製區域,比如可設定Inset
| [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.textInsets)];
/
/-> UIKit
|
| |-> UIButton
| | 設定顏色,文字一定要指定button狀態
| | 善於使用contentEdgeInsets,可以設定文字邊距【點選】
| | 設定圓角可layer.cornerRadius
| |-> UITextfield
| | 隱藏鍵盤,[textfield resignFirstResponder]
| | ★ 任意頁面隱藏鍵盤【點選】
| |-> UIScrollerView
| | 上拉下拉原理【點選】
| |-> UITableView
| | 複用,注意重寫 – (void)prepareForReuse
| | dequeueReusableCellWithIdentifier 從重用池中獲取,可能是nil
| | dequeueReusableCellWithReuseIdentifier 同上,但是不會是nil
| | 插入,刪除,移動section或item的順序,需遵循下面兩個步驟【點選】
| | 1. 更新dataSource的資料
| | 2. 呼叫相應的collection view方法刪除或者插入section或item
| | ★非常嚴格的條件:,在更新collection view之前,先更新datasource,
| | 因為collection view總是假設你已經準備好打他source了 否則collection view收到錯誤的item,並造成crash
| | 右側音序條【點選】
| | UITableView上拉、下拉原理【點選】
| | AsyncDisplayKit 流暢的解決方法【點選】
| | ★tableView正在滾動的時候,如果reloadData,偶爾發生App crash的情況【點選】
| | ★UITableview Deceleration 加速滑動(慣性滑動)、彈性迴歸原理【點選】
| |-> UIDevice
| | 裝置名 [UIDevice currentDevice].name,
| | 系統版本號 [[UIDevice currentDevice].systemVersion doubleValue]; 【點選】
| | 螢幕旋轉方向 [[UIDevice currentDevice] orientation]
| | 區分iPad還是iPhone [UIDevice currentDevice].userInterfaceIdiom);
| |-> UIScreen
| | 如何正確的繪製1畫素的線【點選】
| | 保證邊距不變,內容等比例拉伸【點選】
| |-> UIEdgeInsets
| | 實際顯示邊距,跟設定邊距的距離【點選】
| ->自動佈局
| Masonry
| storyboard
|
| /-> NSObject 既是物件也是協議,可以將物件自動置nil 比如 int = 0 bool = NO
| | 幾乎所有類的基類或者協議【點選】
| | isKindOfClass:和isMemberOfClass:,通過這兩種方法可以確定一個類的從屬關係
| | 後者測試一個接收器是否是一個指定類的例項;而後者可以測試類的從屬關係。
| | respondsToSelector: 方法測試一個接收器是否通過selector實現(implements)了一個標誌符話的方法
| | description方法,允許一個物件返回一個字串來描述它的內容;這個常用於除錯debug
| | encodeWithCoder: 和 initWithCoder:方法,NSCoding協議中僅有的組成成員
| | 第一個允許物件編譯它的例項變數,第二個允許一個物件初始化它自身的解碼例項變數。
| | conformsToProtocol:方法,測試接收器(物件或者類)符合一個給定的協議(protocol)
| | ★類物件中的 isa 指向類結構被稱作 metaclass【點選】跟[object class]有點區別,比如KVO的時候
| | ★__weak如何實現物件值自動設定為nil的【點選】
| |-> NSString & NSMutableString
| | NSString作為屬性時候,用copy還是strong修飾?
| | strong是單純的增加物件的引用計數,而copy操作是執行了一次深拷貝【點選】
| |-> NSArray & NSMutableArray
| | NSArray 各種遍歷方式,倒序遍歷【點選】
| | NSArray簡便初始化方法@[@”1″,@”2″];
| | 淺拷貝。陣列本身使用地址,但是陣列item仍是舊物件【Apple 官方解釋點選】
| | 無論copy、arrayWithArray、copyWithZone 陣列內物件並沒有變。
| | 只是copy出來的array是新地址,arrayWithArray出來的陣列也是新地址。
| | 深拷貝。陣列本身使用地址,但是陣列item是新地址
| | [[NSArray alloc] initWithArray:someArray copyItems: YES];
| | 深拷貝時候,陣列中的item必須實現NSCopying協議並實現copyWithZone:
| | ★防止NSArray was mutated while being enumerated
| | array包含array的情況深拷貝。NSArray* trueDeepCopyArray = [NSKeyedUnarchiver
| | unarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject:oldArray]];
| | ★containsObject 注意:在對比陣列中元素的時候,呼叫元素的isEqual的返回值。
| |-> NSDictionary & NSMutableDictionary
| | 取值時候,最好判斷object的型別。 if ([object isKindOfClass:[NSString class]]){ //todo};
| |-> NSNumber 和 NSInteger NSRange
| | 前者專門用來裝基礎型別的物件,把整型、單精度、雙精度、字元型等基礎型別儲存為物件
| |-> NSNull FMDB資料庫,使用的時候崩潰
| | JsonKit轉換以後會生出相應的[NSNull null]物件【點選】
| |-> NSData 位元組緩衝區
| | + (nullable instancetype)dataWithContentsOfURL:(NSURL *)url
| | dataWithContentsOfURL 雖然是同步的,但可以結合gcd 非同步載入網路圖片【點選】
| |-> NSUserDefaults【點選】
| | 可用於APP setting 預設值不好用,SDK bug
| | 設定WebVIew的UA【點選】
| |-> NSDate & NSDateFormatter & NSCalendar
| | 可判斷過去幾個小時,還是幾天 – (NSDateComponents *) components:fromDate:toDate:options:
| | 可獲取時間戳
| | 有時候有8小時的時差,解決辦法【點選】
| | 在開發iOS程式時對日期處理的總結【點選】
| |-> NSCoding & NSCoder 僅有的兩個方法,資料的序列號和反序列化【點選】
| | – (void)encodeWithCoder:(NSCoder *)aCoder;
| | – (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
| |-> NSCopying & NSZone
| | + (instancetype)allocWithZone:深拷貝,類似於memcpy這樣的C方法【點選】
| |-> NSAutoreleasePool
| | 降低記憶體峰值【點選】
| |-> NSFileManager 刪除檔案的時候先判斷是否存在是個好習慣
| |-> NSTimer
| | NSTimer 簡單使用 【點選】
| | ★ NSTimer定時器時間並不精確,類似於公交車進站,堵車就不準時【點選】
| |-> NSLog暴力列印,常用於測試【點選】
| |-> NSClassFromString 從字串獲取類。NSStringFromClass,從類名獲取字串
| | ★ 不要小瞧這兩個API,配合使用,他可以做到程式碼邏輯解藕的效果。
| /
|-> Foundation
|
| |-> NSIndexPath 鏈式結構;tableview用的比較多【點選】
| | 初始化 [NSIndexPath indexPathForRow:0 inSection:1];
| |-> NSError 網路變成經常用到
| |-> NSException
| |-> NSStringEncoding NSString的編碼格式,瞭解即可【點選】
| |-> NSProgressIndicator
| |-> NSBundle 是個目錄,包含了程式使用的資源,如影像,聲音,編譯好的程式碼,nib檔案【點選】
| |-> NSNetServiceBrowser
| |-> NSValue 可以包裝任意一個物件,可以用NSValue將struct存到NSArray和NSDictionary中。【點選】
| |-> NSURLConnection iOS9已不再使用
| |-> NSURLSession & NSURLSessionTask 【點選】NSURLSession提供的功能:
| | 通過URL將資料下載到記憶體【點選】
| | 通過URL將資料下載到檔案系統
| | 將資料上傳到指定URL
| | 在後臺完成上述功能【點選】
| |-> NSURLRequest 包裝了網路請求的資訊【點選】
| |-> NSInputStream & NSOutputStream socket程式設計【點選】
| |-> NSPredicate
| | 謂語查詢,原理和用法都類似於SQL中的where【點選】
| |-> NSLayoutConstraint
| |-> NSLock & NSRecursiveLock & NSCondition 多執行緒鎖
| | 最基本的同步鎖【點選】
| | @synchronized{//todo} 同樣也是同步鎖【點選】
| | 事實上訊號量也能實現鎖的目的,訊號量和鎖的區別【點選】第二篇【點選】
| |-> NSMethodSignature
/ | 配合NSInvocation實現訊息轉發【點選】
iOS |-> NSInvocation 直接呼叫 某個物件的訊息【點選】
| iOS中可以直接呼叫 某個物件的訊息 方式有2種performSelector:withObject: 和NSInvocation
| | 當然,還以用C語言的函式指標,參見下面的“方法調配技術”
| |-> NSSet 無序的物件集合,用處少
| |-> NSUrl 基本使用,包含File URL和File path【點選】
| |-> AVPlayer基本使用【點選】
| | 獲取視訊時間長度 【點選】
| -> NSNotificationCenter 同步的機制【點選】注意防止重複,相似的機制還有delegate,observer,block
|
| /-> 建立push原理介紹、證照製作、測試push 專輯 【點選】
| | “iOS push全方位解析(一)【譯文】”——iOS PUSH概述【點選】
| | “iOS push全方位解析(二)【譯文】”——生成OpenSSL證照,Provisioning Profile【點選】
| | “iOS push全方位解析(三)【譯文】”——一個極簡的demo,並測試一下push【點選】
| /
|-> Push
|
| | ★ iOS6、7、8、9 Push的演化 【點選】,但目前還是不盡人意(APP 無法獲取通知欄訊息數目)
| | ★ php寫的可以在本機傳送iOS push程式【點選】
| | iOS7 Background Remote Notification(後臺遠端通知——靜默push)【點選】
| -> 有一些三方push SDK:極光push
|
|-> block 必須掌握
| block專輯【點選】;Block帶有區域性變數的匿名函式;iOS開發尤其實用
| 【block程式設計第一篇】 block程式設計熱點介紹(官方文件翻譯的)【點選】
| 【block程式設計第二篇】 block捕獲變數和物件【點選】
| 【block程式設計第三篇】block記憶體管理——如何驗證block在棧上,還是堆上【點選】
| 【block程式設計第四篇】block的實現【點選】
| 【block程式設計第五篇】block中使用 weak–strong dance 技術避免迴圈引用【點選】
|-> 多執行緒
| iOS有三種多執行緒程式設計的技術,分別是:【點選】
| 1、NSThread 下面會講到
| 2、Cocoa NSOperation 下面會講到
| 3、GCD 下面會講到
| 這三種程式設計方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單。
| dispatch_once 執行一次,用於建立單例【點選】可滿足執行緒安全
| iOS 不像C++ 那樣,可以直接將建構函式設成private。所以建立絕對單例模型需重寫allocWithZone,【點選】
|
| /-> 引用計數(retainCount)
| | retain 引用計數+1 物件alloc時,引用計數為1, release引用計數-1.引用計數=0時候,真正釋放
| | autoRelease,自動釋放物件【點選】
| |-> 便捷構造方法 iOS
| | 物件在自動釋放池中,不需要開發者手動釋放,比如下面的方法
| | NSString的stringWithString
| | NSArray的arrayWithObjects:和arrayWithArray:
| | UIImage的imageNamed:
| |-> 記憶體管理高階指南【官方譯點選】
| |-> 記憶體管理實踐【點選】
| /
|-> 記憶體管理【專欄點選】
|
| |-> MRC 手動引用計數。release和retain成對兒
| ->ARC 自動引用計數
| ★強烈建議使用ARC
| ★禁止在函式內返回區域性變數指標,不然就是野指標!
| ★容易引起迴圈引用的地方【點選】
| ★– (id)performSelector:(SEL)aSelector withObject:(id)object;引起警告
| warning:performSelector may cause a leak because its selector 【點選】
|
|-> 程式間通訊(APP間通訊)【點選】【點選】
| iOS可通過URL Scheme,呼叫別的APP(iOS內的應用呼叫協議),APP 實現 – (BOOL)application: openURL: options:
|
| /-> Runtime 執行時特點【《執行時之一:類與物件》南峰子出品 點選】
| | Objective-C程式設計師可以在程式執行時建立,檢 查,修改類,物件和它們的方法【點選】
| | Objective-C runtime庫也負責找出方法的最終執行程式碼
| | ★class Objective-C類是由Class型別來表示的,它實際上是一個指向objc_class結構體的指標。
| | struct objc_class {
| | Class isa OBJC_ISA_AVAILABILITY;
| | #if !__OBJC2__
| | Class super_class OBJC2_UNAVAILABLE; // 父類
| | const char *name OBJC2_UNAVAILABLE; // 類名
| | long version OBJC2_UNAVAILABLE; // 類的版本資訊,預設為0
| | long info OBJC2_UNAVAILABLE; // 類資訊,供執行期使用的一些位標識
| | long instance_size OBJC2_UNAVAILABLE; // 該類的例項變數大小
| | struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; // 該類的成員變數連結串列
| | struct objc_method_list **methodLists OBJC2_UNAVAILABLE; // 方法定義的連結串列
| | struct objc_cache *cache OBJC2_UNAVAILABLE; // 方法快取
| | struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 協議連結串列
| | #endif
| | } OBJC2_UNAVAILABLE;
| | 1. isa:所有的類自身也是一個物件,這個物件的Class裡面也有一個isa指標,它指向metaClass
| | 2. super_class:指向該類的父類,如果該類已經是最頂層的根類,則super_class為NULL。
| | 3. cache:用於快取最近使用的方法。提高方法查詢效率
| | ★objc_object與id objc_object是表示一個類的例項的結構體
| | struct objc_object {
| | Class isa OBJC_ISA_AVAILABILITY;
| | };
| | typedef struct objc_object *id;
| | 當建立一個類的例項物件時,分配的記憶體包含objc_object資料結構,然後是類的例項變數的資料。
| | NSObject類的alloc和allocWithZone:方法使用函式class_createInstance來建立objc_object資料結構。
| | 另外還有我們常見的id,它是一個objc_object結構型別的指標
| | ★meta class元類,是一個類物件的類;它儲存著一個類的所有類方法。
| | 當我們向一個物件傳送訊息時,runtime會在這個物件所屬的這個類的方法列表中查詢方法;
| | 而向一個類傳送訊息時,會在這個類的meta-class的方法列表中查詢。
| | ★繼承體系【點選】
| | 動態建立類【點選】
| | objc_setAssociatedObject【點選】給物件增加屬性,一般配合類別使用
| | object_getClass 得到一個例項的類【點選】
| | objc_copyImageNames 獲取指定類所在動態庫【南峰子出品點選】
| | objc_copyClassList 建立並返回一個指向所有已註冊類的指標列表【點選】
| | class_xxx系列函式【點選】
| | class_copyPropertyList 獲取類的屬性
| | class_addMethod 為類新增方法
| | class_isMetaClass 判斷是否為元類
| | class_getName 獲取類名
| | class_copyIvarList 拷貝類的例項變數列表
| | class_getInstanceMethod 獲取例項方法
| |-> Runnloop 【ibireme出品 點選】
| | RunLoop 實際上就是一個物件,這個物件管理了其需要處理的事件和訊息
| | 並提供了一個入口函式來執行上面 Event Loop 的邏輯
| | Run Loop並非iOS平臺專屬的概念,在任何平臺的多執行緒程式設計中,為控制執行緒生命週期【點選】
| | 接收處理非同步訊息,都需要類似Run Loop的迴圈機制來實現:從簡單的一個無限順序
| | do{sleep(1);//執行訊息}while(true),到高階平臺,如Android的Looper,都是類似的機制。
| | ★PerformSelecter 當呼叫 NSObject 的 performSelecter:afterDelay: 後,實際上其內部會建立一個 Timer
| | 並新增到當前執行緒的 RunLoop 中;所以如果當前執行緒沒有 RunLoop,則這個方法會失效【點選】
| /
|-> iOS 動態機制
|
| |-> 訊息傳遞 objc_msgSend【點選】【南峰子出品 點選】
| | obj-c脫胎於smalltalk的訊息處理。所有方法呼叫都是發訊息。訊息是啥?一串字元【點選】
| | 如果向某物件傳遞訊息,那就會使用動態繫結機制來決定需要呼叫的方法
| | objc_msgSend有兩個隱藏引數,訊息接收物件 方法的selector ,即(self,_cmd)
| |-> 訊息轉發 message forwarding【點選】
| | 就是物件在接收到無法解讀的訊息之後會發生什麼情況
| | (1) +(BOOL) resolveInstanceMethod:(SEL)selector 類是否新增一個例項方法
| | (2) resolveClassMethod 是否新增了類方法
| | (3) -(id) forwardingTargetForSelector:(SEL)selector 能不能把這條訊息轉給其他接收者來註冊
| | (4)-(void) forwardInvocation:(NSInvocation*)invocation 訊息派發系統
| | (5)最後若都不能處理訊息,則doesNotRecognizeSelector: 會丟擲異常
| | ★當我們不能確定一個物件是否能接收某個訊息時,會先呼叫respondsToSelector:來判斷一下
| |-> SEL【點選】
| | SEL又叫選擇器,是表示一個方法的selector的指標,每一個方法都對應著一個SEL。
| | OC在編譯的時候,會根據方法的名字(包括引數序列),生成一個用 來區分這個方法的唯一的一個ID
| | 這個ID就是SEL型別的。需要注意的是,只要方法的名字(包括引數序列)相同,那麼它們的ID都是相同的。
| | 就是 說,不管是超類還是子類,不管是有沒有超類和子類的關係,只要名字相同那麼ID就是一樣的
| | ★方法的定義體裡面,我們可以通過訪問_cmd得到這個方法自己的SEL。
| |-> 方法調配技術 method swizzling 用於除錯【南峰子出品點選】
| | IMP 它是objetive-C 方法(method)實現程式碼塊的地址,實際上是函式指標,指向方法實現的首地址
| | IMP imp = [requestItem.delegateTarget methodForSelector:selector];
| | void (*func)(id, SEL, ResponseItem *) = (void *)imp;
| | func(requestItem.delegateTarget, selector, responseItem);
| | 可以從selector獲取IMP,比如:- (IMP)methodForSelector:(SEL)aSelector;
| | Swizzling應該總是在+load中執行
| -> 事件響應鏈【點選】另外一篇【點選】
| 在 iOS 中,幾乎所有類都是 responder,比如 UIWindow、UIView、UIControl、UIControllers 等
| 當手指去觸控螢幕上 UIView 的例項物件 aView。產生一個觸控事件 UIEventTypeTouches
| 而接收觸控事件的物件 aView,就是一個 responder object。
| initial view –> super view –> …..–> view controller –> window –> Application –> AppDelegate
|
| /-> 沙盒(Sandbox)iOS沙盒機制【容芳志出品點選】
| | 每個應用程式都有自己的儲存空間
| | 應用程式不能翻過自己的圍牆去訪問別的儲存空間的內容
| | 應用程式請求的資料都要通過許可權檢測,假如不符合條件的話,不會被放行。
| |-> Group iOS8+資料共享,例如擴充套件(Extension)共享資料【點選】
| |-> Spotlight iOS9+ 系統搜尋。【官方demo點選】
| |-> GCD(Grand Central Dispatch) iOS開發有一個強有力的多執行緒工具 【點選】
| | 多執行緒入門【raywenderlich出品 點選】
| | 系統提供一個叫做 主佇列(main queue)
| | 系統還提供一個叫做全域性排程佇列(Global Dispatch Queues)有四個優先順序
| | 開發者自己建立佇列(序列,或者並行)
| | ★至少有五個佇列任你處置:主佇列、四個全域性排程佇列,再加上任何你自己建立的佇列。
| | GCD 深入理解:第一部分【點選】
| | GCD 深入理解:第二部分【點選】
| | 開發常見方法介紹
| | dispatch_after 延後工作
| | Dispatch Groups 會在整個組的任務都完成時通知你
| | dispatch_semaphore_t 訊號量,讓你控制多個消費者對有限數量資源的訪問。【點選】
| | dispatch_semaphore_wait 使得訊號量-1,當=0時候阻塞
| | dispatch_semaphore_signal 釋放訊號量,即訊號量+1
| |
| |-> CoreData資料持久化,相比sqlite有下面優勢【點選】
| | 資料庫欄位或者表有更改會導致crash,CoreData的版本管理和資料遷移變得非常有用,
| | 手動寫sql語句操作還是麻煩一些。
| | 不光能操縱SQLite,CoreData和iCloud的結合也很好,如果有這方面需求的話優先考慮
| | 並不是直接操縱資料庫,比如:使用CoreData時不能設定資料庫的主鍵,目前仍需要手動操作。
| | 效率上其實跑程式時感覺不出來,畢竟手機上的資料不能跟網站的資料和訪問量相提並論。
| /
|-> 特殊封裝&平臺特性
|
| |-> 類別(Category)擴充套件(Extension)微小區別【點選】
| | 堪稱iOS程式設計的精髓【點選】念茜出品【點選】
| |-> KVC 鍵值編碼
| | 在IOS的中,沒有絕對的私有,包括方法和變數,可以通過字元獲取屬性【點選】
| |-> KVO 鍵值觀察,依賴isa-swizzling技術【王中周出品 點選】
| | 依賴Runtime 和KVC 一個新的類會動態被建立。詳細原理【點選】另外一篇【點選】
| | 同時派生類還重寫了 class 方法以“欺騙”外部呼叫者它就是起初的那個類。
| | 然後系統將這個物件的 isa 指標指向這個新誕生的派生類,因此這個物件就成為該派生類的物件了,
| | 因而在該物件上對 setter 的呼叫就會呼叫重寫的 setter,從而啟用鍵值通知機制
| | ★Person在建立KVO監聽前和之後的列印輸出 self->isa:Person [self class]:Person
| | self->isa:NSKVONotifying_Person [self class]:Person
| | ★比如:Tableview上拉下拉動畫檢測offset;播放視訊,獲取視訊時長時候等
| | 為什麼KVO不成對兒呼叫,會崩潰?
| |-> 多工
| | 後臺執行一段時間(不是地圖,voip類app)【點選】
| |-> 3D Touch ,通過在plist中新增選單,然後app實現下面的方法。進入APP
| | – (void)application: performActionForShortcutItem: completionHandler:
| |-> spotlight 通過系統搜尋,進入APP【點選】
| -> Touch ID 如何使用iOS 8 指紋識別,程式碼、例項【點選】
|-> HTTPs
| 建立安全連結【點選】
| https進階【點選】
|
-> iOS工具
CrashHlytics Crash統計工具
AFNetworking 和 ASIHttp
SDImage
TMCache
AsyncDisplayKit 是 Facebook 推出的用於保持介面流暢性的框架
——————————————————————————————
參考文獻:《Objective-C高階程式設計:iOS與OS X多執行緒和記憶體管理》日本人寫的;
《Effective Objective C 2.0:編寫高質量iOS與OS X程式碼的52個有效方法》;
《Objective-C基礎教程(第2版)》
網路部落格參考(無循序):念茜、南峰子、ibireme、容芳志、唐巧、王巍、董柏然、阮一峰、一片楓葉,王中周,頤和園等博主
參考的公眾帳號:《iOSDevTips》
完整的UIKit和Foundation 結構 <點選>