/->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 加速滑動(慣性滑動)、彈性迴歸原理【點擊】
| | ★UITableview 刷新某一個cell 或 section【點擊】
| | ★UITableview 上拉隱藏搜索框,下拉出現搜索框【點擊】
| |-> 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中。【點擊】php
| |-> 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
| \
| | ★ iOS六、七、八、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有三種多線程編程的技術,分別是:【點擊】
| 一、NSThread 下面會講到
| 二、Cocoa NSOperation 下面會講到
| 三、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的方法列表中查找。html
| | ★繼承體系【點擊】
| | 動態建立類【點擊】
| | 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版)》 ios
網絡博客參考(無循序):念茜、南峯子、ibireme、容芳志、唐巧、王巍、董柏然、阮一峯、一片楓葉,王中周,頤和園等博主git
參考的公衆賬號:《iOSDevTips》即唐巧的公衆賬號;《iOSDevTip》程序員