精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS開發:詳解Objective-C runtime

移動開發 iOS
本文是我在 Alt Tech Talks: London 上關于 Objective-C runtime的演講總結,如果你對Objective-C runtime感興趣的話,應該看看這篇文章,特別是文章中的鏈接,一定會受益匪淺。

本文是我在 Alt Tech Talks: London 上關于 Objective-C runtime的演講總結,如果你對Objective-C runtime感興趣的話,應該看看這篇文章,特別是文章中的鏈接,一定會受益匪淺。 

什么是Objective-C runtime?

簡單來說,Objective-C runtime是一個實現Objective-C語言的C庫。對象可以用C語言中的結構體表示,而方法(methods)可以用C函數實現。事實上,他們 差不多也是這么干了,另外再加上了一些額外的特性。這些結構體和函數被runtime函數封裝后,Objective-C程序員可以在程序運行時創建,檢 查,修改類,對象和它們的方法。

除了封裝,Objective-C runtime庫也負責找出方法的最終執行代碼。當程序執行[object doSomething]時,不會直接找到方法并調用。相反,一條消息(message)會發送給對象(在這兒,我們通常叫它接收者)。runtime庫 給次機會讓對象根據消息決定該作出什么樣的反應。Alan Kay反復強調消息傳遞(message-passing)是Smalltalk最重要的部分(Objective-C根據Smalltalk發展而來),而不是對象: 

由于以前關于這個話題我創造了“對象”這個詞,現在很多人都對這個概念趨之若鶩,這讓我感到非常遺憾。

其實這里面更為重要的理念是“消息命令”(messaging),這才是Smalltalk的核心內容(現在尚有一些內容還沒有全部完成)。日 語中有個簡短的單詞叫做“ma”,它用來表示兩個物體之間的東西,在英語中和它最相近的單詞也許是“interstitial”。制造一個龐大且可擴展系 統的關鍵是設計它各個模塊之間的通信方式,而不是關注它的內部屬性和行為。 

實際上,在一篇介紹Smalltalk虛擬機的文章里,這門編程技術被叫做消息傳遞或者消息傳送范式。“面向對象”通常用來描述內存管理系統。

在演講和文章中都使用ObjC runtime這個詞,看似只有一個,實際上存在很多runtime庫。雖然它們都支持對象的自省檢查和消息接收,但是它們卻有不同的特性和實現方式(例 如,同樣是發送消息,Apple的runtime用一步完成,而GNU runtime會先查詢這些消息,然后執行查找到的函數分兩步完成)。以下所有的討論,都是基于Apple的***runtime庫(蘋果公司在OSX 10.5和iOS發布時的版本)。 

在那次演講中,我決定研究runtime庫某些領域的功能。我找了一些希望更透徹了解的東西,然后把它們做成問答的形式組成我的演講。

動態創建類

如何實現Key-Value Observing?

 當我在準備這次演講時,一篇叫做KVO considered harmful 的文章開始擁有很多擁躉。它提出了很多對KVO正確的批評,但相對于舍棄觀察者模式不用,我更想探索出一種新的實現方式。 

KVO實現觀察者模式的關鍵是它偷偷摸摸將被觀察對象的類改變了,它子類化原來的類后,就能夠自定義該對象的方法來調用KVO的回調方法。這些都是通過 objc_duplicateClass這個方法完成,但很遺憾,這個方法并不公開,我們無法私自調用。 

條條大路通羅馬,好在除了objc_duplicateClass,還有其他方法可以通過使用秘密子類化的方式實現觀察者模式,比如創建和注冊 “class pair”。那么什么是class pair呢?對于Objective-C的類來說,都有一對Class的對象來定義它:Class對象定義了這個類的實例方法,而metaclass定義 了這個類的類方法。所以每個class其實是它metaclass的單例。 

這個代碼展 示了觀察者模式的工作原理。當你給對象增加觀察者時,這個對象首先會檢查自己是否可被觀察,如果是,它會新創建一個類,用我們自己的-dealloc替代 原來類的方法,同樣它也會把-class方法替換掉,類似于KVO被觀察對象,當你訪問被觀察對象的類名時,返回的是它原來的類名,而不是新生成的類。

創建完類后,我們需要照著 Key-Value Coding為屬性增加一個setter方法:這個setter方法會獲取這個屬性修改前的值和修改后的值,然后調用block形式的回調函數,將這兩個值告訴觀察者。代碼中根據我們的意愿,這個block可以異步調用。 

請注意, -addObserverForKey:withBlock:會使用s object_setClass() 將被觀察對象的類替代為新組建的類。這樣做最主要的目的是將消息轉變為方法的方式改變,但是這需要非常小心,原來的類和新的類必須有相同的成員變量布局。 因為成員變量也是用過runtime訪問,修改某個對象的類可能導致runtime無法找到對應的變量。 

我們在存儲觀察者集合時遇到些麻煩,因為沒地方去存它們。給ObserverPattern這個類增加成員變量不起作用,因為根本沒有生成這個類的對象。被觀察對象的成員變量是它原來類的,它并沒有考慮過這些觀察者。 

Objective-C runtime通過引入 associated objects 幫助我們擺脫這個困境。在runtime里,理論上所有對象都可以擁有包含其他對象的字典。通過associated references,被觀察對象可以存儲和訪問他們的觀察者,而不需要額外的成員變量。

如果你運行多次后,你會發現ObserverPattern 還是有點小毛病的。由于觀察者回調是異步調用的,觀察者接

收到的變化事件也是亂序的。這意味著觀察者其實無法區分被觀察屬性的最終狀態是什么,回調中的新值可能早已被修改。我這樣做的目的是為了說明在KVO中同步調用回調其實是個有用的特色,并非bug。 

創建對象

那些額外的字節都是干啥用的?

當你創建一個 Objective-C對象時,runtime會在實例變量存儲區域后面再分配一點額外的空間。這么做的目的是什么呢?你可以獲取這塊空間起始指針(用 object_getIndexedIvars),然后就可以索引實例變量(ivars)。好吧,下面我會使用自定義數組來說明一下索引ivars的用 處。 

讓我們創建一個數組!從這個SimpleArray中可以看到兩件事情:最明顯的一件是它使用了類簇模式。 當使用+alloc方法返回對象時,一般情況下已經為這個對象分配了所有的內存,但是在這個例子中,在+alloc時并不知道需要多大的內存空間。只有當 調用了 -initWithObjects:count:以后,才能根據數組內對象數量計算出這個數組需要多大的內存,所以+alloc只是返回一個占位符,只有 在初始化后才會分配和返回真正的數組對象。 

或許你會問為什么我們要用類簇把事情搞那么復雜,使用 calloc()另外分配一塊大小合適的緩存,然后把那些對象指針存到里面不就得了?答案是希望利用局部性原理提高訪問性能。從數組的設計上我們可以看出,每次數組指針被訪問時,之后會有很大幾率訪問到緩存指針,所以把它們肩并肩的放入內存意味著找到其中一個就是找到了另外一個。 

消息派發

消息如何轉發?

Objective-C其中一個強大特性是對象不需要實現某個方法,盡管它在編譯時聲明了該選擇符(selector)。但它可以在運行時再決 定方法實現,或者將這些消息轉發給其他對象,或者發出異常,亦或做一些其他事情。但是這個特性的某些方面曾經一直困擾我:消息轉發(message forwarding)會調用 -forwardInvocation:,然后傳入一個NSInvocation 對象。但是這個NSInvocation 類是在Foundation庫中定義的,難道說runtime工作需要Foundation配合? 

我試著挖掘其中的原因,發現答案并不是我想的那樣,runtime不需要知道Foundation。runtime會讓程序定義轉發函數 (forwarding function),當 objc_msgSend()無法找到該selector的實現時,那個轉發函數就會被調用。程序一啟動,CoreFoundation就將 -forwardInvocation:定義成轉發函數。 

讓我們來創建一個Ruby! 當然并不是真的實現完整的Ruby,Ruby有一個叫做#method_missing的函數,當對象收到一個它沒有實現的消息時,這個函數就會被調到, 這和Smalltalk的做法比較相似。使用objc_setForwardHandler,我們也能在Objective-C的類中實現類似Ruby的 methodMissing:方法。 

總結

Objective-C runtime可以有效的幫助我們為程序增加很多動態的行為。一些開發者除了使用method swizzling幫助調試程序,并不會在實際程序中使用它,但runtime編程的確有很多功能,它應該成為實際應用代碼編寫的重要工具。

原文地址:http://blog.securemacprogramming.com/2013/12/by-your-_cmd/

責任編輯:閆佳明 來源: oschina
相關推薦

2011-04-08 10:51:17

Objective-CiOS

2011-07-29 15:47:21

iPhone開發 Objective- C

2011-08-17 10:58:59

Objective-C構造函數

2011-07-29 16:16:30

Objective-c block

2015-09-07 09:53:02

Objective-CRuntime

2014-09-26 09:49:48

SwiftObjective-C

2011-07-28 15:11:23

iOS Objective-

2015-07-08 10:51:27

Objective-CRuntime

2012-04-23 11:00:56

iOS開發Objective-CJavaScript

2011-07-18 16:36:51

Objective-C XCode

2015-10-08 10:01:10

Objective-CLayout

2011-08-17 10:29:39

Objective-C預處理

2011-08-04 09:47:33

iOS Objective- JavaScript

2011-08-04 13:38:01

Objective-C C++

2011-08-15 14:32:42

Objective-C委托協議

2014-04-28 09:56:56

Objective-CiOS命名空間

2011-08-01 17:11:43

Objective-C 函數

2011-08-17 11:05:22

Objective-C方法

2011-07-27 16:55:12

Objective-c 閉包

2011-08-16 13:43:40

Objective-C文件cocoa
點贊
收藏

51CTO技術棧公眾號

www免费视频观看在线| 亚洲免费视频二区| 动漫av一区| 色婷婷综合中文久久一本| 亚洲精品久久区二区三区蜜桃臀 | 波多野结衣乳巨码无在线观看| 成人av网站在线| 国产精品美女久久| 久久国产精品二区| 不卡在线一区二区| 精品久久久久香蕉网| 久久婷婷国产91天堂综合精品| 超碰在线网址| 日本一区二区三区在线观看| 国产不卡一区二区在线观看| 少妇一级淫片日本| 最新国产拍偷乱拍精品| 久久精品成人欧美大片| 一本色道综合久久欧美日韩精品| www.91精品| 色综合天天在线| 黄色三级中文字幕| 亚洲s色大片| 久久一留热品黄| 国产精品99久久久久久久| 国产九色91回来了| 久久不射中文字幕| 性欧美在线看片a免费观看| 国产人与禽zoz0性伦| 久久99国内| 亚洲精品理论电影| jjzzjjzz欧美69巨大| 国产不卡精品在线| 精品视频一区三区九区| 老头吃奶性行交视频| 忘忧草在线日韩www影院| 夜夜精品浪潮av一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4 | 在线观看国产精品一区| 激情小说亚洲图片| 欧美成人一区二区三区片免费| 黄色aaa级片| 肉色欧美久久久久久久免费看| 亚洲国产另类av| 妞干网视频在线观看| 麻豆传媒视频在线观看| 国产精品电影一区二区三区| 日韩欧美亚洲v片| 久久久久久青草| 久久香蕉国产线看观看99| 久久99精品久久久久久三级| 三级视频在线看| 9i在线看片成人免费| 韩国一区二区三区美女美女秀| 亚洲精品久久久久久久久久久久久久| 国产精品一区二区久激情瑜伽 | 国产无套内射久久久国产| 涩涩视频网站在线观看| 欧美日韩色婷婷| 日韩av资源在线| 日韩成人av电影| 在线观看视频一区| 免费涩涩18网站入口| 欧美日韩卡一| 在线不卡中文字幕| 自拍一级黄色片| 97久久亚洲| 亚洲精品999| 91精品人妻一区二区| 欧美精品系列| 久久精品视频在线播放| 黄页网站免费观看| 99在线|亚洲一区二区| 国产ts人妖一区二区三区| 姑娘第5集在线观看免费好剧| 麻豆91在线播放| 亚洲综合自拍一区| 婷婷五月综合久久中文字幕| 国产欧美一区二区三区网站| 在线观看成人av| 国产高清在线a视频大全| 精品久久久久久久久久久久久| 色欲av无码一区二区人妻| 一区二区视频免费完整版观看| 欧美精品第1页| 在线观看亚洲免费视频| 欧美日韩爱爱| 欧美精品在线极品| 9i看片成人免费看片| 麻豆成人91精品二区三区| 国产精品一级久久久| 久久经典视频| 亚洲免费av高清| 日本精品免费在线观看| 中文字幕日本一区| 日韩av综合中文字幕| 国产wwwwxxxx| 国产日韩欧美一区二区三区在线观看| 国产精品国产三级国产专播精品人| 国产精品自产拍| 久久久99免费| 很污的网站在线观看| 亚洲www啪成人一区二区| 欧美大黄免费观看| 后入内射无码人妻一区| 日韩一级欧洲| 91网在线免费观看| 你懂的视频在线| 一卡二卡欧美日韩| 色国产在线视频| 欧美激情久久久久久久久久久| 日韩中文字幕国产精品| 波多野结衣视频网站| 国产精品一区二区三区99 | 9191国语精品高清在线| 97不卡在线视频| 国产婷婷在线视频| 中文av字幕一区| 欧美牲交a欧美牲交| 日本免费精品| 日韩中文字在线| 国产一级片av| 99久久久久免费精品国产| 麻豆md0077饥渴少妇| 日韩欧美一区二区三区免费观看| 亚洲成人精品在线| 亚洲天堂黄色片| 男女男精品网站| 欧美精品二区三区四区免费看视频| 91在线中文| 欧美日韩免费观看一区三区| 一区二区三区四区免费| 亚洲精品偷拍| 国产日韩精品一区观看| 牛牛精品在线| 日韩精品一区二区三区swag| 无码人妻精品一区二区三区夜夜嗨| 日本一不卡视频| 日本精品国语自产拍在线观看| 欧美办公室脚交xxxx| 亚洲成人网在线| 久久精品国产亚洲av高清色欲 | 国产精品一区视频| 色呦呦在线资源| 日韩视频在线你懂得| 婷婷伊人五月天| 国产精品影音先锋| 国产欧美123| 中文字幕av一区二区三区四区| 久久精品国亚洲| 国产免费黄色录像| 亚洲靠逼com| 波多野结衣电影免费观看| 欧美在线高清| 高清不卡日本v二区在线| 青春草在线免费视频| 精品久久99ma| 天天操天天爽天天干| 91色婷婷久久久久合中文| 北条麻妃在线一区| 国产在线观看91一区二区三区| 国产成人精品午夜| 日韩精品毛片| 日韩一级片网站| 国语对白一区二区| 91麻豆精品秘密| 国产又大又黄又粗的视频| 日韩黄色大片网站| 亚洲影院污污.| 俺来俺也去www色在线观看| 亚洲精品美女在线观看| 无码人妻熟妇av又粗又大| 国产精品久久午夜| 亚洲妇女无套内射精| 99亚洲一区二区| 先锋影音日韩| 欧美.com| 日本久久久久久久久| jizz日韩| 欧美成人激情免费网| 久久不卡免费视频| 国产精品麻豆视频| 日韩欧美中文在线视频| 亚洲男女自偷自拍| 永久久久久久| 丝袜美腿综合| 成人黄色av播放免费| aa级大片免费在线观看| 中文字幕亚洲激情| 黄色av网站免费在线观看| 一本高清dvd不卡在线观看| 少妇高潮在线观看| 99精品欧美一区二区三区小说| 爱情岛论坛成人| 亚洲性感美女99在线| 四虎一区二区| 久久1电影院| 成人国产亚洲精品a区天堂华泰| 国产社区精品视频| 久热精品视频在线观看| 免费理论片在线观看播放老| 日韩一区二区在线观看| 欧美日韩综合一区二区三区| 一区二区三区在线视频观看58 | 无码国产色欲xxxx视频| 欧美绝品在线观看成人午夜影视| 日产欧产va高清| 亚洲视频在线一区观看| 国产吞精囗交久久久| 国产福利91精品一区二区三区| 国产真实乱子伦| 国产尤物精品| 国产精品h视频| 精品国产乱码久久久久久果冻传媒| 粉嫩av一区二区三区免费观看| 91大神在线观看线路一区| 26uuu亚洲伊人春色| 欧美日韩经典丝袜| 日韩视频在线免费| 国产精品免费观看| 亚洲精品久久久久国产| 亚洲av无码专区在线| 69堂亚洲精品首页| 亚洲天堂999| 欧美三级日韩三级国产三级| 毛片毛片女人毛片毛片| 亚洲成人你懂的| 99精品久久久久| 亚洲日本电影在线| 免费成人深夜夜行网站| 国产精品无遮挡| av在线播放中文字幕| 国产日韩欧美精品在线| 中文字幕av网址| 久久免费午夜影院| 性久久久久久久久久| av综合在线播放| 人妻 丝袜美腿 中文字幕| 国产精品一区二区果冻传媒| 做a视频在线观看| 国产在线精品一区二区三区不卡| 亚洲 欧美 另类人妖| 青青草精品视频| 亚洲福利精品视频| 毛片不卡一区二区| 少妇一级淫免费播放| 蜜桃久久精品一区二区| 欧美美女一级片| 极品美女销魂一区二区三区| 思思久久精品视频| 国产黄色精品网站| 国产精品偷伦视频免费观看了| 国产精品18久久久久久久久| 古装做爰无遮挡三级聊斋艳谭| 国产精品1区二区.| 亚洲色偷偷色噜噜狠狠99网| 99视频在线精品| 国产又粗又猛又色| 久久综合久久综合九色| 亚洲一区视频在线播放| 国产精品全国免费观看高清| 国产成人自拍网站| 亚洲国产日韩精品| 成年人av网站| 欧美美女喷水视频| 亚洲AV无码精品自拍| 亚洲国产欧美一区二区三区久久| 无套内谢的新婚少妇国语播放| 亚洲人免费视频| 日韩专区在线| 久久91亚洲精品中文字幕奶水 | 亚洲草久电影| 国产夫妻自拍一区| 亚洲在线播放| 亚洲天堂2018av| 成人午夜大片免费观看| av在线网站观看| 亚洲欧美偷拍三级| 国产超碰人人爽人人做人人爱| 欧洲精品视频在线观看| a网站在线观看| 亚洲人高潮女人毛茸茸| 黄色成人影院| 91国语精品自产拍在线观看性色 | 久久狠狠亚洲综合| 久久久久亚洲av无码网站| 久久久www成人免费毛片麻豆 | 99电影在线观看| 亚洲瘦老头同性70tv| 26uuu成人| 香蕉成人久久| 久久久久久久久久久影视| 久久久777精品电影网影网 | 中文精品在线观看| 成人免费在线观看入口| xxxxxx国产| 欧美另类变人与禽xxxxx| 深夜福利视频网站| 久久视频在线视频| 欧美一级二级视频| 国产一级二级三级精品| 国产精品88久久久久久| 九九九九免费视频| 国产乱国产乱300精品| 国产一二三四区在线| 午夜精品一区二区三区电影天堂| 亚洲影视一区二区| 亚洲美女久久久| eeuss鲁一区二区三区| 91精品视频在线播放| 亚洲性视频大全| 国产精品久久久久久久乖乖| 久久国产人妖系列| 欧美特级黄色录像| 亚洲成人av免费| 国产99久久九九精品无码免费| 亚洲少妇激情视频| 精品捆绑调教一区二区三区| 999热视频| 小小影院久久| 丁香婷婷激情网| 99精品国产热久久91蜜凸| 日韩欧美综合视频| 欧美人伦禁忌dvd放荡欲情| 男人久久精品| 欧美一二三视频| 国产三级精品三级在线观看国产| 宅男av一区二区三区| 日本在线不卡一区| 熟女高潮一区二区三区| 姬川优奈aav一区二区| 成人午夜福利视频| 欧美大片在线看| 日韩视频一区二区三区四区| 正在播放亚洲| 精品影院一区二区久久久| 免费一级特黄3大片视频| 91久久精品午夜一区二区| 神马久久高清| 91精品国产乱码久久久久久久久| 国产精品qvod| 缅甸午夜性猛交xxxx| 99久免费精品视频在线观看| 日本一区二区欧美| 亚洲精品国产拍免费91在线| sm在线播放| 麻豆av一区二区三区| 久久一区二区三区四区五区| 婷婷色一区二区三区| 在线免费不卡电影| jizz在线观看中文| 成人免费视频a| 欧美精选在线| 第四色在线视频| 日韩欧美国产免费播放| 欧美男男激情freegay| 国产成人av在线播放| 久久中文亚洲字幕| 国产毛片久久久久久| 亚洲综合男人的天堂| 日韩黄色影片| 国产精品看片资源| 欧美国产美女| 色综合久久久无码中文字幕波多| 亚洲国产精品久久一线不卡| 亚洲人成色777777老人头| 日韩av手机在线观看| 久久高清免费| 不许穿内裤随时挨c调教h苏绵| 亚洲www啪成人一区二区麻豆 | 久久综合网hezyo| 97久久亚洲| 国产男女激情视频| 亚洲欧美激情在线| 日韩在线视频观看免费| 国产成人精品久久亚洲高清不卡| 色喇叭免费久久综合| 国产裸体视频网站| 欧美日韩一区二区三区| www.久久热.com| 99一区二区三区| 媚黑女一区二区| 日本爱爱小视频| 亚洲国产精品久久久久| 欧洲成人一区| av 日韩 人妻 黑人 综合 无码| 99国产精品视频免费观看| 在线观看国产精品入口男同| 久久久久久成人精品| 欧美美女一区| 大尺度在线观看| 欧美日韩你懂的| 中文字幕这里只有精品| 日韩中文在线字幕| 久久久www免费人成精品| 成人h动漫精品一区二区无码| 欧美在线一区二区三区四| 欧美久久综合| 精品一区二区三孕妇视频| 亚洲电影在线观看|