1.理解內(nèi)存管理
- 除了objective-c之外,微軟的COM喷众、C++11也提供了基于引用計數(shù)的內(nèi)存管理方式
- 引用計數(shù)的這種管理方式類似于文件系統(tǒng)里邊的硬鏈接
- 不要向已經(jīng)釋放的對象發(fā)送消息
- 自己回收對象發(fā)retainCount消息,得到的引用計數(shù)不確定
- X-code提供的Instruments工具集可以方便的檢測循環(huán)引用紧憾,Product->Profile->Leaks
- 自動引用計數(shù)是蘋果WWDC2011年大會上提出用于內(nèi)存管理的技術的到千,MacOS上的垃圾回收機制已被廢棄,而是用ARC替代
- 如果ARC下想用MRC赴穗,在后邊加上
-fno-objc-arc
- 底層的CoreFoundation下憔四,需要手動管理內(nèi)存
- CFRetain,CFRelease方法
2.掌握GCD
- iOS4中提出
3.使用UIWindow
- UIWindow繼承自UIView
- UIWindow 般眉,windowLevel 有是三個值:Nomal了赵、statusBar、Alert甸赃;分別對應的層級是0柿汛,1000,2000埠对;
- 使用場景:網(wǎng)易云音樂右上角的音樂络断,支付寶的九宮格密碼,有道云筆記的密碼輸入界面
4.安全性問題
安全的傳輸用戶密碼
- 公鑰加密密碼->服務器私鑰解密->多次MD5->與數(shù)據(jù)庫中進行對比
防止通訊協(xié)議被破解
- 對傳輸內(nèi)容采用類似于Protobu的開源交換格式
驗證應用內(nèi)支付的憑證
- 越獄手機可能出現(xiàn)中間人攻擊技術项玛,偽造支付憑證貌笨,我們需要仔細驗證購買憑證,并且告知用戶在越獄手機上進行支付的風險
本地文件的數(shù)據(jù)安全
- 原生和前端混編時稍计,應考慮將JS代碼進行加密混淆
- 本地重要文件要進行加密躁绸,或者保存在keyChain中
源代碼安全
- 黑客可以分析變異之后的二進制程序文件:反編譯中IDA最為厲害,還有file臣嚣、otool、class-dump剥哑。
- 應對措施:使用宏來簡單混淆類名硅则,關鍵邏輯使用C實現(xiàn)
5.CoreText
- CoreText處理文字和字體的底層技術,直接與CoreGraphics(Quartz)打交道
- CoreText內(nèi)存小株婴,渲染快怎虫,高度可以提前獲取,在后臺線程中運行困介,但是代碼惡心
6.實戰(zhàn)技巧
- 巧用截屏功能實現(xiàn)側滑返回(iOS7)
- JS文件默認在編譯列表而不是資源列表中 需要手動處理
7.Objective-C對象模型
isa指針
- 每一個對象都有一個名為isa的指針大审,指向該對象的類。
- NSObject就是一個包含isa指針的結構體
- 每一個類也是對象座哩,擁有isa指針
- 因為類也是對象徒扶,所以他必須是另外一個類的實例,這個類叫做元類(metaclass)根穷,元類的對象的指針姜骡,指向根元類(root metaclass)
- NSObject元類的isa指針指向自己
- 對象在內(nèi)存中的排布可以看成是一個結構體导坟,該結構體在運行時無法給對象增加成員變量,運行時采用的方法的實現(xiàn)機制不同圈澈,并不是改變了對象的內(nèi)存結構
- 對象的方法定義都保存在類的可變區(qū)域中惫周,說明了為什么Category可以為對象增加成員方法,卻不能增加成員變量
- KVO的實現(xiàn)康栈,動態(tài)的修改了isa指針的值
MethodSwizzling
- class_replaceMethod 替換類方法的定義:當需要替換的方法有可能不存在時递递,可以考慮使用這種方法
- method_exchangeImplementations 交換兩個方法的實現(xiàn):當需要交換兩個方法的實現(xiàn)是,可以使用這個方法
- method_setImplementation 設置一個方法的實現(xiàn):最簡單的用法啥么,當僅僅需要為一個方法設置其實現(xiàn)方式時使用
- 實例:唐巧的UIImagePickerController漾狼,iPad橫屏的bug
8.Tagged Pointer 對象
- 給64位系統(tǒng)帶來了內(nèi)存的節(jié)省和運行效率的提高,Tagger Pointer 通過在其最后一個bit位設置一個特殊的標記饥臂,用于將數(shù)據(jù)直接保存在指針本身中逊躁,因為Tagged Pointer 并不是一個真正的對象,我們在使用是需要注意不要直接訪問其isa變量
9.Block
- 分為全局block隅熙,棧中的Block稽煤,堆中的Block
- NSConcteteGlobalBlock、NSConcteteStackBlock囚戚、NSConcreteMallocBlock
- ARC下只有全局Block和堆Block