A. swift能試用oc編寫的第三方sdk么
swift和oc的runtime是一樣的,在開發者大會上也說過可以輕松的在swift中使用oc的文件,我已經使用過很多第三方的sdk了,一般要創建一個頭文件,在頭文件中引入第三方sdk需要使用的頭文件,然後再和項目綁定,就可以使用了
B. 如何逐步點亮iOS開發技能樹
iOS開發能力 掌握(最好是精通)OC語言和runtime各種細節(讀過相關的clang源碼和runtime源碼為佳)。精通基本的framework(Foundation,UIKit等,平時幹活用得最多的)。掌握一些第三方的輪子,這個主要看你的工作經驗和習慣,如果自己有搞過不...
C. 怎麼獲取 oc runtime 官方源碼
#import <objc/runtime.h>
@implementation NSObject (XXOOProperty)
/* 獲取對象的所有屬性和屬性內容 */
- (NSDictionary *)getAllPropertiesAndVaules
{
NSMutableDictionary *props = [NSMutableDictionary dictionary];
unsigned int outCount, i;
objc_property_t *properties =class_PropertyList([self class], &outCount);
for (i = 0; i<outCount; i++)
{
objc_property_t property = properties[i];
const char* char_f =property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:char_f];
id propertyValue = [self valueForKey:(NSString *)propertyName];
if (propertyValue) [props setObject:propertyValue forKey:propertyName];
}
free(properties);
return props;
}
/* 獲取對象的所有屬性 */
- (NSArray *)getAllProperties
{
u_int count;
objc_property_t *properties =class_PropertyList([self class], &count);
NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* propertyName =property_getName(properties[i]);
[propertiesArray addObject: [NSString stringWithUTF8String: propertyName]];
}
free(properties);
return propertiesArray;
}
/* 獲取對象的所有方法 */
-(void)getAllMethods
{
unsigned int mothCout_f =0;
Method* mothList_f = class_MethodList([selfclass],&mothCout_f);
for(int i=0;i<mothCout_f;i++)
{
Method temp_f = mothList_f[i];
IMP imp_f = method_getImplementation(temp_f);
SEL name_f = method_getName(temp_f);
const char* name_s =sel_getName(method_getName(temp_f));
int arguments = method_getNumberOfArguments(temp_f);
const char* encoding =method_getTypeEncoding(temp_f);
NSLog(@"方法名:%@,參數個數:%d,編碼方式:%@",[NSString stringWithUTF8String:name_s],
arguments,
[NSString stringWithUTF8String:encoding]);
}
free(mothList_f);
}
@end
D. runtime實現的機制是什麼,有哪些用法,一般用於幹嘛
runtime庫裡麵包含了跟類、成員變數、方法相關的API,比如獲取類裡面的所有成員變數,為類動態添加成員變數,動態改變類的方法實現,為類動態添加新的方法等 需要導入<objc/message.h><objc/runtime.h>1.是什麼
1> runtime是一套比較底層的純C語言API, 屬於1個C語言庫, 包含了很多底層的C語言API
2> 平時編寫的OC代碼, 在程序運行過程中, 其實最終都是轉成了runtime的C語言代碼, runtime算是OC的幕後工作者
3> 舉例:
OC :
[[MJPerson alloc] init]runtime :
objc_msgSend(objc_msgSend("MJPerson" , "alloc"), "init")2.用過么? 怎麼用?
1> runtime是屬於OC的底層, 可以進行一些非常底層的操作(用OC是無法現實的, 不好實現)
* 在程序運行過程中, 動態創建一個類(比如KVO的底層實現)
* 在程序運行過程中, 動態地為某個類添加屬性方法, 修改屬性值方法
* 遍歷一個類的所有成員變數(屬性)所有方法3.相關的頭文件和函數
1> 頭文件
* <objc/runtime.h>
* <objc/message.h>2> 相關應用
* NSCoding(歸檔和解檔, 利用runtime遍歷模型對象的所有屬性)
* 字典 --> 模型 (利用runtime遍歷模型對象的所有屬性, 根據屬性名從字典中取出對應的值, 設置到模型的屬性上)
* KVO(利用runtime動態產生一個類)
* 用於封裝框架(想怎麼改就怎麼改)3> 相關函數
* objc_msgSend : 給對象發送消息
* class_MethodList : 遍歷某個類所有的方法
* class_IvarList : 遍歷某個類所有的成員變數
* class_.....
E. 如何通過WebView監控提升WebAPP性能
相對於需要專業移動開發人員的原生應用(Native APP),基於HTML5/CSS/JavaScript的WebAPP憑借開發者門檻低、迭代迅速、支持跨平台發布等特點,成為電商、銀行等網路服務、瀏覽類應用的首選,然而由於頁面渲染導致的性能差距是WebAPP與原生應用無法抗衡的最大原因,因此針對WebView組件的性能優化就顯得至關重要。
為什麼是WebView
WebAPP所顯示的Web頁面都是由一個叫做WebView的組件渲染出來的,每個網頁都有一個鏈接即URL,首先將URL轉換成NSURLRequest,然後用載入網頁的類WebView載入Request,使用 - (void)loadRequest:(NSURLRequest *)request這個方法,就能將網頁載入顯示出來。
目前iOS中有兩個載入網頁的類,分別是UIWebView和WKWebView,UIWebView是UIKit框架中的一個類,而WKWebView是WebKit框架中的類,從性能上來說WKWebView的性能高、穩定性好、佔用內存小,完全優於UIWebView。但由於WKWebView是iOS8提供的組件,因此系統版本低於iOS 8.0的iPhone/iPad用戶就無法正常使用WKWebView組件開發出來的APP。所以目前大部分開發人員還在使用性能、穩定性並不理想的UIWebView進行WebAPP開發,而本文所說的雲智慧透視寶WebView性能監控也是以UIWebView為主要優化目標。
要進行性能監控必須獲得WebAPP頁面載入全過程的性能數據,透視寶是通過向當前載入鏈接的html5、jsp、php網頁代碼中注入獲取數據的JS代碼,然後通過OC與JS交互,將數據傳遞給OC,然後再將數據整理發送到透視寶後端。
監控哪些WebView性能數據
透視寶能監控四大類數據:
行為數據:抓取用戶在移動端網頁點的行為操作,也就是點擊網頁的內容,分析用戶的行為
時間相應數據:分解一個鏈接從載入開始到完成這段時間內,每個階段的耗時
Ajax請求數據:抓取終端用戶響應時間,響應數據下載時間,數據響應成功的callback執行時間和ajax錯誤數據
JS錯誤數據:抓取載入鏈接的代碼錯誤信息
① 時間響應數據及數據計算公式
(圖片來源:51cto技術博客)
參見上圖,JS傳給透視寶的時間響應數據就是這些欄位,其中navigationStart是起點,所有的計算都需要依賴於它。分析移動端H5性能數據,其實就是測算HTML5、JSP、PHP等網頁元素在iOS上載入的時間長短,通過這些性能數據前段開發人員能夠准確發現性能問題並及時解決,下表是透視寶定義的響應時間分解數據及計算方案:
② 資源時序數據
每一個網頁都是有很多資源組成的,包括.js、.png、.jpg、.css、script等,每一個元素的載入都需要載入時間,資源時序數據就是准確記錄每一個元素的載入時間及類型,並把這些數據通過JS的performance介面直接獲得並傳給OC,不需要計算。
③ JS錯誤及ajax請求數據
JS錯誤指的是抓取網頁代碼的錯誤,包括錯誤類型及堆棧信息,直接定位錯誤。ajax請求的數據有請求的鏈接、uri、 終端用戶響應時間,響應數據下載時間,數據響應成功的callback執行時間和ajax錯誤數據。JS錯誤和ajax請求數據都是有JS代碼直接獲取到,不需要處理。
JS代碼注入
想要准確監測網頁性能就需要進行代碼注入,而只有拿到網頁的代碼才能注入, UIWebView這個類裡面除了三個載入鏈接的方法和4個代理方法,就沒有其他內容了,而這些方法並不能獲取到內容,所以我們就需要考慮其他方法。UIWebView在載入攔截的時候會進入NSURLProtocol這個類,而恰好這個類能拿到當前載入鏈接NSURLRequest,而且會走進這個類的 - (void)startLoading方法,這個方法在頁面load完成之前,頁面剛載入之後,所以就是我們所需要的。
創建一個類,繼承NSURLProtocol這個類,重寫startLoading方法,由於能拿到鏈接的request,所以我們就對這個鏈接發送請求,用原生態的NSURLConnection或者NSURLSession都可以,我們用的NSURLConnection這個類發送請求並設置代理,方法是這個 - (nullableinstancetype)initWithRequest:(NSURLRequest*)request delegate:(nullableid)delegate startImmediately:(BOOL)startImmediately,
NSURLConnection的代理方法中有一個能接受請求鏈接數據的方法, - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data,得到的NSData是16進制的位元組流數據,通過utf8轉碼將位元組流轉換成字元串,然後發現這個字元串正好是這個當前載入網頁的代碼,
網頁代碼都是由標簽組成,都會有<head>這個標簽,我們就把JS代碼注入到<head>標簽之下,放在自己添加的<script>標簽中;代碼實現就是獲取字元串中<head>這個字元的位置,然後在其下面插入用<script>包裝的js代碼,然後轉回成新的NSData的位元組流數據。
由於頁面還沒有載入,我們已經改動代碼了,就需要把注入JS代碼的重新記載一次,需要用NSURLProtocol的代理屬性NSURLProtocolClient,用NSURLProtocolClient這個中的這個方法- (void)URLProtocol:(NSURLProtocol*)protocol didLoadData:(NSData*)data,將新的NSData載入一次,轉回成NSData是因為這個方法需要的是NSData數據。
當然上面只是介紹主要實現的一些方法,還需要用到NSURLConnection的其他代理方法,只是這些方法不需要添加什麼,按照常規處理就行了,就不一一介紹了。
性能數據獲取
載入鏈接過程中JS代碼就會通過performance介面獲取數據,然後獲取的這些數據需要傳給移動端,如何傳遞數據呢,傳遞數據的過程也叫OC與JS交互的過程。
獲取數據的時機:
由於不清楚什麼時候JS能拿到數據,所以從最開始就需要進行交互的監控,也就是載入鏈接的時候,因為透視寶SDK用來監控的所以我們不能直接使用這個方法,需要用到OC的運行時,動態載入機制,又叫hook。首先通過添加UIWebView的類目,添加類目是將UIWebView類的實現分散出來,每個類都是由NSbject繼承下去,所以每個類都有 (void)load方法,而且這個方法的執行是最早的,我們就在這個方法中使用OC的運行時runtime,使用一個方法交換UIWebView載入鏈接的三個方法的指針,這樣就會在執行載入方法之前執行我們交換出來的方法,在這個方法裡面我們傳遞一個與JS匹配的標識,通過標識相同來獲取數據,這樣做的目的就是能從最開始就監控數據的傳遞。
F. 有沒有自學 iOS 開發的一些經驗
基礎
一定的編程經驗
這里說的編程經驗是至少熟練一門編程語言,對 OOP 有一定的了解,最好熟悉一些基本的設計模式。遇到過的好多 iOS 開發,大多是從別的語言轉過來的,所以有一定的編程基礎,學起來會更容易 get the point.
如果是第一次接觸編程,當然也是沒問題的,只是要做好心理准備,可能會比想像的難。
英語
發現不少開發對於英語似乎有點接受不能,通常都是中文優先,除非迫不得已,才硬著頭皮看看 StackOverflow,英文文章,文檔等。忘了是誰說過「難走的路越走越好走」,通常如此。其實只要稍微 push 一下自己,那些技術文章啃下來應該不會有太大的問題,有過幾次成功的體驗後,這種恐懼感就會減少很多。優質的文章、視頻、書籍,多是英文的,不邁過這個 坎,將來要麼成為瓶頸,要麼花更大的成本去填補。
入門
書籍
要學習 iOS 開發,自然要先學 Objective-C (當然現在也可以直接上 Swift,不過如果多人協作的話,OC目前還是主流),因為 OC 是 C 語言的超集,所以了解 C 語言對於學習 OC 肯定會有幫助,不過就算不了解,直接學 OC 也沒太大問題。
這里推薦 BNR (Big Nerd Ranch) 的這本 Objective-C Programming The Big Nerd Ranch Guide,講解地比較細致,能幫助你更好的理解 OC,更重要的是教你遇到問題時,如何去解決問題,以及這個問題對應的一些知識點,如何使用文檔等等。
來到一個新的世界,肯定會對這個世界充滿好奇,想訂閱一大堆博客,買一堆書,看各種教程和視頻,然後就變得浮躁,不知該從哪下手,這會導致拖延症。 我渴了,給我倒一杯水,這個很直接,馬上就可以做,但如果是給我買一瓶飲料,而自己對那些飲料又不怎麼熟悉時,就糾結了,不如刷會微博,看看朋友圈,玩個小游戲先。
所以一本好的入門教材很重要,要契合自己當前的水平,且常常會有收獲,這種成就感會激勵著你繼續學下去。
在看書的過程中,往往會有這樣的經歷:書中提到某個人、觀點、知識點、書、文章,然後就順著它提到的這些東西出去了,可能某個知識點又牽扯到另一些內容,然後就這樣越走越遠。想起了一個故事——
三隻獵狗追一隻土拔鼠,土拔鼠逃跑時鑽進了一個樹洞。這個樹洞只有一個出口,不一會兒,忽然從樹洞里跑出一隻兔子。兔子飛快地向前跑,並爬上另一棵大樹。兔子因為慌亂在樹上沒站穩,掉了下來,砸暈了正仰頭看的三隻獵狗,最後,兔子終於逃脫。
對於這個故事可以從不同的角度去解讀,我更願意以初心去解讀。兔子為什麼會爬樹?為什麼能砸暈三隻獵狗?這不是重點,重點是,之前追趕的土撥鼠哪去了?看書時難免會有延伸閱讀,這個深度我覺得不宜超過 2 層,不然很容易就回不來了。
還有就是如果有可能,最好每天都看點,這其實是很難的,因為總是會有優先順序更高的事,或者之前的某些習慣在干擾。一旦斷了幾天,就不想再拿起來了。
還有,蘋果官方的 Start Developing iOS Apps Today 也是很不錯的入門材料。
視頻
推薦斯坦福老頭子(Paul Hegarty)的 Developing iOS 7 Apps for iPhone and iPad ,當初也是看的這個(那時還是更老的版本),Paul 是資深的 Mac/iOS 開發(前蘋果員工?),很多知識點講得很到位,學生們的提問也大都在點上,同時配有Demo,總之聽下來會對 iOS 開發有比較全面的了解。
同時推薦一本小冊子:objc-zen-book,花不長時間就能看完,裡面是一些 Best Practices,對於編寫優質代碼會很有幫助。
筆記
這是一個持久的過程,任何階段都適用。以前也沒太在意這個,覺得概念性的東西,腦子過一遍,就大概知道了,然後就去啃其他的東西了,現在看來,如果有記筆記的話,會更有助於消化概念、知識點,也可以記錄自己的思考過程。達芬奇就記錄了10000多頁的筆記。
記筆記可以加深對知識點的理解,而成為編程巨星的唯一秘訣就是:對所做的事情理解地越深,就會做得越好。同時如果遵循遺忘曲線去復習的話,效果更佳。對知識點了解地足夠透徹後,Debug 時才更有可能知道問題出在哪,解決問題也更容易有思路。
筆記不僅可以記知識點,也可以記錄調試過程,比如這篇筆記,有一種調試方法:小黃鴨調試法
許多程序員都有過向別人(甚至可能向完全不會編程的人)提問及解釋編程問題,就在解釋的過程中擊中了問題的解決方案。一邊闡述代碼的意圖一邊觀察它實際上的意圖並做調試,這兩者之間的任何不協調會變得很明顯,並且更容易發現自己的錯誤。
生活中我們可能不會真的這么去做,這時抽離出另一個自己,記錄下跟ta的對話,也是個發現問題的好方法。
練習
這也是一個持續的過程,知道了些概念或原理後,總是會想著去驗證下是不是這樣,無論結果是否如自己預期,實踐的過程會降低對語言的陌生感,慢慢地培養一種駕馭這門語言的自信,如果出了錯,正好可以重新梳理一下。
目標
如果靜下心來看完了 BNR 的這本書,以及斯坦福的 iOS 開發視頻,那麼對 OC 應該比較了解了,一些常用的 UIKit 用起來也沒什麼問題了,比如 UIViewController / UIView / UIScrollView / UIImageView / UITableView。也熟悉一些概念,如 KVO / MVC / Delegate / DataSource。
這個階段下來,應該會有:哦,iOS 開發也就這樣嘛,多翻翻文檔,熟悉 Cocoa Touch 的一些 Class,差不多也能做出一個簡單的 App 了。
進階
入門之後,接下來可以折騰的東西還會有不少。
書籍
Effective Objective-C 2.0,裡面提到了 52 種提高 iOS App 質量的途徑。涉及了 API 設計、protocols / category 的使用、寫出更模塊化的代碼等,讀下來應該會有不少收獲。
iOS Programming: The Big Nerd Ranch Guide (4th Edition),又是一本 BNR 的書,這本書的特點是通過 Demo 來引出知識點,然後提一些問題,並且會細說解題思路。看書的過程中,對於元學習能力的提升也會有一定幫助。
--- update ---
發現巧哥的 iOS開發進階 已經可以在京東買到了,雖然沒有細看,但巧哥出品質量肯定有保障。
其他資源
進入這個階段後,可以去探索更大的世界了,現在的資源已經很豐富了,但還是要遵循「少而精」的原則。以下是我覺得挺不錯的資源
iOS Dev Weekly 每周一期,內容多為這一星期里值得關注的Github項目、文章、工具等。
iOS 移動開發周報 這是唐巧大大整理的每周不錯的 iOS 開發相關的內容,多為中文。
RayWenderlich 很多詳細又全面的教程,不容錯過。
iOS Dev Slack 國內不少 iOS 開發(包括大大們)都在這里,不過現在好像不怎麼能拿到邀請了。
中文 iOS/Mac 開發博客列表,打開工具訂閱吧。
還有,如果可能的話,多去分享自己學到的東西,教是最好的學,我試過幾次,效果真的很不錯。
目標
這個階段下來,對於常用的設計模式、內存管理、Blocks 的使用、圖像操作、網路請求和管理、多線程應該比較熟悉了。對於 CALayer、Animation、UIScrollView、UITableView、UICollectionView、 ViewController Container 則非常熟悉,對「非常熟悉」的定義是:不打開 Xcode,腦子里就能把相應的知識點復述出來 80% ,比如這個類有哪些方法,Delegate / DataSource 有哪些方法,怎麼使用,如果要實現某個效果,應該怎麼做(好吧, UICollectionView 除外)。
高級
其實高級、進階、入門並沒有嚴格的界限,在入門階段也可以探究高級階段的一些東西。我覺得支撐我們不斷探索和前進的動力不是興趣,而是永不滿足的好奇心,和對優雅代碼的追求。
If your standards are low, you're going to stop pretty early on in the process.
BNR 的這篇 Leveling Up 已經講得很好了,也更加細致。
書籍
iOS 7 Programming Pushing the Limits 這本書對 iOS 7 的一些特性會講解地比較深入,當然也不僅僅是 iOS 7。只嘆 iOS 更新實在太快,書籍往往跟不上,一本好書往往需要很長時間來撰寫,等書可以出版了,iOS 又出新版本了。
源碼
看優秀的源碼,可以學到很多東西,使用過程中遇到問題也更容易解決。這些是我覺得值得細看的源碼:AFNetworking(NSOperation, HTTP, Block), SDWebImage(Image Handle, Cache, NSOperation, Block),SVPullToRefresh(UIScrollView, State Handle), JSONModel(runtime)
如果有興趣,也可以翻翻 CoreFoundation / OC runtime 的源碼。
資源
oleb
NSHipster
objc.io || objcio.cn
WWDC 視頻
工具
chisel Facebook 出品的 LLDB 助手,用於調試很方便
Reveal 每當好奇某個 App 的實現時,都會打開它一窺究竟,用於調試自己的 App 也很方便
Aspects steipete 大大出品的一款方便使用 method swizzling 的工具,可以在運行時動態添加代碼到某個方法
class-mp 從 Mach-O 文件生成 OC 頭文件,有時想看看某個 App 大概是如何組織的會比較方便
Hopper 可以對二進制文件進行反編譯,甚至可以生成偽代碼!有時想看看 UIViewController 里某個方法大概是怎麼實現的,就可以用它。
Instruments 這個內置的工具對於發現 App 的各種問題很有幫助,如內存佔用、泄露,渲染問題等。
目標
這個階段,對於底層的實現會有更深入的了解,各種 Core 開頭的 Framework 至少可以說出個大概,工具也能熟練使用,「正經的代碼」寫過數萬行,可能天天在翻 Dash。如果別人讓你實現某個功能,能在較短的時間內給出不錯的實現方案,並且足夠細致,甚至精細到如何使用 Core Graphic 去畫某個圖像。
其他
我覺得無論學習什麼,「速成」的心態是最要不得的,這只會讓自己變得浮躁,一知半解,整個過程也很難讓自己的元學習能力得到提升。慢慢來,攻佔一個城後,再去打下一個,這時心態也會平和許多。
G. 一個資深的iOS開發者需要掌握哪些技能
iOS開發能力
掌握(最好是精通)OC語言和runtime各種細節(讀過相關的clang源碼和runtime源碼為佳)。精通基本的framework(Foundation,UIKit等,平時幹活用得最多的)。掌握一些第三方的輪子,這個主要看你的工作經驗和習慣,如果自己有搞過不錯的輪子最好(這點可以看出你的經驗,眼界和解決問題的能力。)
基礎知識 學校里的那些經典課程(數據結構,演算法,三大浪漫基礎,各分支研究領域的基礎課程),這些反正都是老生常談了。。。不好好打基礎只能書到用時方恨少了。即使做不到精通,至少應該了解各個基礎知識的關系和入口點(知識體系結構),就像你寫oo時建立的類層次結構。
學習能力 能根據自己的工作目標快速的調研、掌握、改進和山寨各種技術,並且能把各種相關知識點融合起來,產生新技術,推動技術發展。搜索技能,其實很多人不知道自己要找什麼和如何去找,到哪去找 提問技巧,能清晰的表達自己的意圖,好讓別人知道怎麼幫你,請搜索「提問的藝術」 廣義的開發能力 不僅限於iOS,要在技術上有所建樹,還是需要開闊自己的眼界,從不同領域汲取營養,開闊眼界,所謂的全棧和跨界正是如此。 搞技術的人要有一顆「好奇心」。
工程能力 各種工具(VSC,CI,Issue Tracking,Testing,Profiling)使用,訂制改進,開發。這些算加分項,合理使用可以有效提高開發效率。 需求能力,可理解,制定和改進各種技術需求,業務需求。文檔能力,各種文檔和繪圖工具,善於表達和總結,最好是多多分享,提高「知名度」和「影響力」 管理能力 管理自己,可以按自己得既定目標有條不紊的前進,遇到突發事件能按優先順序調整並實施新計劃。
管理團隊,首先是三觀端正,有一定的親和力和影響力,能有效的和同事就問題進行商討,有一定的說服能力,可以代領身邊同事一起往正確的方向前進。
H. 理解ios的runtime機制有什麼用
一.RunLoop:
Runloop是事件接收和分發機制的一個實現。
Runloop提供了一種非同步執行代碼的機制,不能並行執行任務。
在主隊列中,Main RunLoop直接配合任務的執行,負責處理UI事件、定時器以及其他內核相關事件。
(1).RunLoop的主要目的:
保證程序執行的線程不會被系統終止。
(2).什麼時候使用Runloop ?
當需要和該線程進行交互的時候才會使用Runloop.
每一個線程都有其對應的RunLoop,但是默認非主線程的RunLoop是沒有運行的,需要為RunLoop添加至少一個事件源,然後去run它。
一般情況下我們是沒有必要去啟用線程的RunLoop的,除非你在一個單獨的線程中需要長久的檢測某個事件。
主線程默認有Runloop。當自己啟動一個線程,如果只是用於處理單一的事件,則該線程在執行完之後就退出了。所以當我們需要讓該線程監聽某項事務
時,就得讓線程一直不退出,runloop就是這么一個循環,沒有事件的時候,一直卡著,有事件來臨了,執行其對應的函數。
RunLoop,正如其名所示,是線程進入和被線程用來相應事件以及調用事件處理函數的地方.需要在代碼中使用控制語句實現RunLoop的循環,也就是說,需要代碼提供while或者for循環來驅動RunLoop.
在這個循環中,使用一個runLoop對象[NSRunloop currentRunloop]執行接收消息,調用對應的處理函數.
Runloop接收兩種源事件:input sources和timer sources。
input sources 傳遞非同步事件,通常是來自其他線程和不同的程序中的消息;
timer sources(定時器) 傳遞同步事件(重復執行或者在特定時間上觸發)。
除了處理input sources,Runloop
也會產生一些關於本身行為的notificaiton。注冊成為Runloop的observer,可以接收到這些notification,做一些額外
的處理。(使用CoreFoundation來成為runloop的observer)。
Runloop工作的特點:
1>當有時間發生時,Runloop會根據具體的事件類型通知應用程序作出相應;
2>當沒有事件發生時,Runloop會進入休眠狀態,從而達到省電的目的;
3>當事件再次發生時,Runloop會被重新喚醒,處理事件.
提示:一般在開發中很少會主動創建Runloop,而通常會把事件添加到Runloop中.
二.Runtime:
RunTime簡稱運行時。就是系統在運行的時候的一些機制,其中最主要的是消息機制。對於C語言,函數的調用在編譯的時候會決定調用哪個函數(
C語言的函數調用請看這里
)。編譯完成之後直接順序執行,無任何二義性。OC的函數調用成為消息發送。屬於動態調用過程。在編譯的時候並不能決定真正調用哪個函數(事實證明,在編
譯階段,OC可以調用任何函數,即使這個函數並未實現,只要申明過就不會報錯。而C語言在編譯階段就會報錯)。只有在真正運行的時候才會根據函數的名稱找
到對應的函數來調用。
那OC是怎麼實現動態調用的呢?下面我們來看看OC通過發送消息來達到動態調用的秘密。假如在OC中寫了這樣的一個代碼:
[objc] view plain?
<span style="font-size:18px;">[obj makeText];</span>
其中obj是一個對象,makeText是一個函數名稱。對於這樣一個簡單的調用。在編譯時RunTime會將上述代碼轉化成
[objc] view plain?
objc_msgSend(obj,@selector(makeText));
首先我們來看看obj這個對象,iOS中的obj都繼承於NSObject。
[objc] view plain?
@interface NSObject <nsobject> {
Class isa OBJC_ISA_AVAILABILITY;
}</nsobject>
在NSObjcet中存在一個Class的isa指針。然後我們看看Class:
[objc] view plain?
typedef struct objc_class *Class;
struct objc_class {
Class isa; // 指向metaclass
Class super_class ; // 指向其父類
const charchar *name ; // 類名
long version ; // 類的版本信息,初始化默認為0,可以通過runtime函數class_setVersion和class_getVersion進行修改、讀取
long info; // 一些標識信息,如CLS_CLASS (0x1L) 表示該類為普通 class ,其中包含對象方法和成員變數;CLS_META (0x2L) 表示該類為 metaclass,其中包含類方法;
long instance_size ; // 該類的實例變數大小(包括從父類繼承下來的實例變數);
struct objc_ivar_list *ivars; // 用於存儲每個成員變數的地址
struct objc_method_list **methodLists ; // 與 info 的一些標志位有關,如CLS_CLASS (0x1L),則存儲對象方法,如CLS_META (0x2L),則存儲類方法;
struct objc_cache *cache; // 指向最近使用的方法的指針,用於提升效率;
struct objc_protocol_list *protocols; // 存儲該類遵守的協議
}
我們可以看到,對於一個Class類中,存在很多東西,下面我來一一解釋一下:
Class
isa:指向metaclass,也就是靜態的Class。一般一個Obj對象中的isa會指向普通的Class,這個Class中存儲普通成員變數和對
象方法(「-」開頭的方法),普通Class中的isa指針指向靜態Class,靜態Class中存儲static類型成員變數和類方法(「+」開頭的方
法)。
Class super_class:指向父類,如果這個類是根類,則為NULL。
下面一張圖片很好的描述了類和對象的繼承關系:
注意:所有metaclass中isa指針都指向跟metaclass。而跟metaclass則指向自身。
Root metaclass是通過繼承Root class產生的。與root class結構體成員一致,也就是前面提到的結構。不同的是Root
metaclass的isa指針指向自身。
I. oc runtime 怎麼得到載入的類
舉例說明:
比如你[obj makeText];
則運行時就這樣的:首先,編譯器將代碼[obj makeText];轉化為objc_msgSend(obj, @selector (makeText));,在objc_msgSend函數中。首先通過obj的isa指針找到obj對應的class。在Class中先去cache中 通過SEL查找對應函數method(猜測cache中method列表是以SEL為key通過hash表來存儲的,這樣能提高函數查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,則取superClass中查找。若能找到,則將method加 入到cache中,以方便下次查找,並通過method中的函數指針跳轉到對應的函數中去執行。
J. 中高級IOS開發程序員要具備哪些能力和技能
一、數據加密必備技能-密碼學
在網路加速發展的時代,數據安全已經是一個必不可少的技術課題。如何讓用戶數據、網路數據、內容數據安
全可靠,也是每個開發者需要深思並捍衛的。熟練掌握密碼學原理,了解 MD5 演算法、非對稱、對稱加密演算法底 層實現,以及如何運用到項目開發中。讓開發者實力捍衛數據安全!
1.密碼的起源歷史
2.Base 64 編碼格式、散列函數
3.MD5 &加鹽、HMAC加密
4.對稱加密演算法
5.RSA Openssl、數字簽名
二、RunLoop
RunLoop是iOS和OS X中非常基礎的一個概念,在開發中不常用,在面試中也幾乎是都會問到的一個問題.對RunLoop的概念以及底層實現原理,都是我們應該要掌握的,並且要知道在開發中哪些地方可以使用到RunLoop。
1.能理解RunLoop概念
2.知道RunLoop的使用方式
3.RunLoop在開發中的使用
三、Runtime
OC 縱橫 iOS 開發已經多年,但是我們真的了解他們?他到底是怎麼樣的一個底層原理?在使用上難道就真的只有
這樣?我們該如何更加掌握這門語言的應用?另外 OC 能做到的 Swift 也能做到嗎?
1.runtime 到底是什麼
2.runtime 怎麼運用
3.runtime 怎麼運用
4.siwft 中如何使用runtime
四、SDWebImage源碼的分析
在開發中, 為了提高工作的效率, 我們大都會引入很多的框架, 覺得只要能能完成自己的工作達到目的就行, 當然這沒錯,但是確忽略了很多好框架中的編程思想,和實現的邏輯, 只知道使用框架, 不知道它裡面的精髓, 長遠來說對我們的發展是不好的, 所以讓我們從經典的框架開始學起,一起來學習SDWebImage的精髓.
1.SDWebImage的demo的分析
2.SDWebImage緩存的概念
3.下載超時和圖片的格式區分
4.SDWebImage的清理機制和內存的監聽
五、H264編碼
扎克伯格說「視頻是未來facebook社交的最重要的行為之一」。作為開發而言,我們應該了解視頻如何做到編碼。在直播平台編碼的技術也是頻頻使用,讓我們從業務層跨往視頻編碼底層的第一步。
1.了解直播項目的架構以及技術突破點;
2.視頻組成原理
3.H264文件的結構
4.軟編碼和硬編碼的區別以及應用場景
5.硬編碼的原理
6.使用硬編碼編碼視頻文件
7.H264解碼的多種處理方式
六、AAC編碼
直播、音視頻項目已經是iOS 應用類的APP的中堅力量。解密音頻編碼過程,讓開發者不在對編碼諱莫如深。映客、全名K歌、網易雲音樂等等知名APP都會用到的音頻AAC編碼方式。
1.了解聲音從模擬信號到數字信號的原理
2.PCM編碼解析
3.AAC編碼原理
4.AAC文件的結構
5.音頻在軟編碼FFmpeg 和 硬編碼的區別
6.利用硬編碼編碼音頻
7.捕獲媒體數據,如何區分音視頻數據
8.利用FFmpeg 合成 H264文件和AAC文件到MP4容器中