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

Ruby開發者如何享受Objective-C

移動開發 iOS
Ruby 和 Objective-C 這兩種語言看上去好像天南地北:一種是動態語言,另一種則是靜態語言;一種是解釋型語言,另一種是編譯型語言;一種有簡潔的語法,另一種則是有點冗長的語法。從優雅的角度來看,Ruby似乎更能給我們一種自由的編程體驗,所以很多人都放棄了Objective-C。

Ruby 和 Objective-C 這兩種語言看上去好像天南地北:一種是動態語言,另一種則是靜態語言;一種是解釋型語言,另一種是編譯型語言;一種有簡潔的語法,另一種則是有點冗長的語法。從優雅的角度來看,Ruby似乎更能給我們一種自由的編程體驗,所以很多人都放棄了Objective-C。

[[110989]]

但這是一個不幸的笑話。Objective-C其實并不像別人認為的那樣是件緊身衣,它和Ruby一樣都受Smalltalk影響,它擁有很多 Ruby開發者都喜愛的語言功能–動態方法查找、鴨子類型、開放的類和通常情況下高度可變的runtime等這些功能在Objective-C中同樣存在,即使那些不出名的技術也是一樣。Objective-C的這些功能都要歸功于它的IDE和編譯器,但也是因為它們才使你不能自由地編寫代碼。

但是等一下,怎么能說Objective-C是動態語言呢?難道它不是建立在C語言的基礎上?

你可以在Objective-C代碼中包含任何C或C++的代碼,但這不意味著Objective-C僅限于C或C++代碼。Objective- C中所有有意思的類操作和對象內省都是來自于一個叫Objective-C Runtime的東西。這個Objective-C Runtime可以和Ruby解釋器相媲美。它包含了強大的元編程里所需要的所有重要特性。

其實C語言和Ruby一樣是支持這些特性的,用property_getAttributesmethod_getImplementation方法就能將selector對應到具體實現(一個selector處理一個方法),并判斷這個對象能否對這個selector做出反應,再遍歷子類樹。在Objective-C的眾多方法中,最重要的就是objc_msgSend方法,是它推動了應用中的每次消息發送。

消息的傳遞

Smalltalk才是實至名歸的***種面向對象語言,它用“從一個對象發送信息給另一個對象”的新概念取代了“調用函數”的舊概念,對后面的語言發展產生了深遠的影響。

你可以在Ruby中通過這樣寫來實現消息的發送:

  1. receiver.the_message argument 

Objective-C的實現方式和Ruby的差不多:

  1. [receiver theMessage:argument]; 

這些消息實現了鴨子類型的方式,也就是說關注的不是這個對象的類型或類本身,而是這個對象能否對一個消息做出反應。

發送消息真的是非常棒的事,但是只有當消息在傳送數據時,它的價值才會被發揮地更大:

  1. receiver.send(:the_message, argument) 

  1. [receiver performSelector:@selector(theMessage:) 
  2. withObject:argument]; 

正如Ruby中方法需要symbol支持一樣,Objective-C中selector也需要string來支持。(在Objective-C中沒有symbol。)這樣就可以讓你通過動態的方式使用一個方法。你甚至可以通過NSSelectorFromString方法來使用string創建一個selector,并在一個對象里執行它。同樣的,我們可以在Ruby中也可以創建一個string或symbol,并把傳給Object#send方法。

當然,無論是哪種語言,一旦你將一個消息發送給不能處理該消息的對象,那么默認情況下就會拋出一個異常,還會導致應用的崩潰。

當你想在調用一個方法前判斷一下這個對象是否能夠執行這個方法,你可以用Ruby中的respond_to?方法來檢查:

  1. if receiver.respond_to? :the_message 
  2.   receiver.the_message argument 
  3. end 

Objective-C中也有差不多的方法:

  1. if ([receiver respondsToSelector:@selector(theMessage:)]) { 
  2.     [receiver theMessage:someThing]; 

變得越來越動態

如果你想在一個不能修改的類(像系統類)中添加你想要的方法,那么Objective-C里的category一定不會讓你失望 — 很像Ruby中的“開放類”。

舉個例子,如果你想將Rails中的to_sentence方法添加到NSArray類中,我們只需要對NSArray這個類進行擴展就好了:

  1. @interface NSArray (ToSentence) 
  2. - (NSString *)toSentence; 
  3. @end 
  4.  
  5. @implementation NSArray (ToSentence) 
  6. - (NSString *)toSentence { 
  7.     if (self.count == 0) return @""
  8.     if (self.count == 1) return [self lastObject]; 
  9.     NSArray *allButLastObject = [self subarrayWithRange:NSMakeRange(0, self.count-1)]; 
  10.     NSString *result = [allButLastObject componentsJoinedByString:@", "]; 
  11.     BOOL showComma = self.count > 2; 
  12.     result = [result stringByAppendingFormat:@"%@ and ", showComma ? @"," : @""]; 
  13.     result = [result stringByAppendingString:[self lastObject]]; 
  14.     return result; 
  15. @end 

Category是在編譯的時候將方法添加到程序中 — 讓我們在runtime中動態捕捉它們怎么樣?

有些消息可以嵌套數據,就像Rails的dynamic finders。Ruby通過對method_missing 和 respond_to這兩個方法的重寫,先匹配模式,再將新方法的定義添加到這個對象中。

Objective-C中的流程是差不多,但我們不是重寫doesNotRecognizeSelector:方法(相當于Ruby中的method_missing方法),而是在resolveClassMethod:方法中捕捉Category添加的方法。假設我們有一個叫+findWhere:equals:的類方法,它可以得到property的名稱和值,那么通過正則表達式就可以很容易實現找到property的名字,并通過block來注冊這個selector。

  1. + (BOOL)resolveClassMethod:(SEL)sel { 
  2.     NSString *selectorName = NSStringFromSelector(sel); 
  3.   
  4.     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^findWhere(\\w+)Equals:$" options:0 error:nil]; 
  5.     NSTextCheckingResult *result = [regex firstMatchInString:selectorName options:0 range:NSMakeRange(0, selectorName.length)]; 
  6.     if (result) { 
  7.         NSRange propertyNameRange = [result rangeAtIndex:1]; 
  8.         NSString *propertyName = [selectorName substringWithRange:propertyNameRange]; 
  9.   
  10.         IMP implementation  = imp_implementationWithBlock((id) ^(id self, id arg1) { 
  11.             return [self findWhere:propertyName equals:arg1]; 
  12.         }); 
  13.   
  14.         Class metaClass = object_getClass(self); 
  15.   
  16.         class_addMethod(metaClass, sel, implementation, "@@:@@"); 
  17.         return YES; 
  18.     } 
  19.   
  20.     return [super resolveClassMethod:sel]; 

這個方法的優點就是我們不需要去重寫respondsToSelector:,因為每個在類中注冊過的selector都會去調用這個方法。現在讓我們調用[RGSong findWhereTitleEquals:@“Mercy”]。當findWhereTitleEquals:***次被調用的時候,runtime并不知道這個方法,所以它會調用resolveClassMethod:,這時我們就將findWhereTitleEquals:這個方法動態添加進去,當第二次調用findWhereTitleEquals:的時候,因為它已經被添加過了,所以就不會再調用resolveClassMethod:了。

這里還有一些別的方法來實現捕捉動態方法。你可以通過重寫resolveClassMethod: 和 resolveInstanceMethod:方法(就像上面的一樣),可以將消息傳遞給不同的對象或全權接管這個“調用”,并在消息傳遞之前,做你想這個消息要完成的任何事。這些方法都會導致運行成本的增加,特別在-forwardInvocation:中會達到頂峰,在這種情況下我們必須要實例化一個對象才能去執行它們。-forwardInvocation:方法中默認調用doesNotRecognizeSelector方法,這導致了應用的頻繁異?;虮罎ⅰ?/p>

內省

動態方法決議并不只是像Ruby和Objective-C這樣的語言的技術支持。你也可以通過在runtime中用一種有意思的方式去操作這些對象。

就像在Ruby中調用MyClass#instance_methods一樣,你可以在Objective-C中調用class_copyMethodList([MyClass class], &numberOfMethods)來得到一個對象中方法的列表。你還可以通過class_copyPropertyList方法得到一個類中property的列表,它能在你的模型中實現不可思議的內省。比如在這個Rap Genius應用中,我們用這個功能來將JSON中的字典映射到本地對象上。

(如果你非常喜歡Ruby中的mixin,那么Objective-C強大的動態支持也能能實現同樣的效果。 Vladimir Mitrovic有一個叫Objective-Mixin的庫,它能在runtime時將一個類中的實現復制到另一個類中。)

現學現用

所有的動態工具都可以用來創建像Core Data這樣的東西,Core Data是一個有點像ActiveRecord的持久化對象圖。在Core Data中,relationship是“有缺陷的”,也就是說他們只有在被別的對象訪問時,才會被加載。每個property的accessor和 mutator在runtime中都被重寫(使用的就是我們上面提到的動態方法決議)。如果我們訪問了一個還沒有被加載的對象時,框架就會從持久性儲存中 動態加載這個對象并將它返回。它保持了內存的低利用率,避免了在任何一個物體被獲取時,實體對象圖表都要被加載到內存中這樣情況的發生。

當Core Data實體中的mutator被調用時,系統會將那個對象標記為需要清理,不需要去重寫每個property的getter和setter。

這就是元程序,羨慕吧!

什么是編譯器?

很明顯,Objective-C和Ruby并不是同一種語言,目前為止***的不同就是Objective-C是一種編譯型語言。

這就是這些技術中最需要注意的地方。在編譯時,編譯器會先確定你應用使用的每個selector是不是都在應用中。如果你處理的這個對象有類型信息,那么編譯器也會檢查確保這個selector在頭文件有聲明過,這樣做就是為了防止在對象中調用未聲明的selector。有些方法可以繞過這些討厭的限制,包括關閉相關的編譯警告。這里就是實踐元程序化的Objective-C***的練習。

你可以通過將selector的類型儲存為不知道的類型或id來從對象中刪除這些類型信息。因為編譯器不認識這個類型,所以它只能假設你的程序可以接受發給它的任何消息(假設這些消息在應用中的其他地方被聲明了,并且相關的編譯標識已經打開)。

善意的忠告:如果我們關掉編譯器標識和把對象保存成id類型,那么將會非常危險的事!其實Objective-C中***的東西之一就是編譯器(是的,比元程序還要好)。類型檢查保證了我們更快的寫和重構代碼,也是我們在編程時少犯錯誤。因為沒有人會關掉那些警告,所以你很難去分享你那些id類型的代碼。大部分Objective-C開發者還是更愿意使用更強的類型而不是元程序。

事實證明Objective-C更受束縛–但因為編譯器能提高更多的安全性和速度,所以我們只能選擇這樣并承擔后果。

事實再次告訴我們,這些語言都是差不多的,Ruby開發者應該享受Objective-C,即使那些中括號讓我們望而卻步。

原文鏈接: Soroush Khanlou   翻譯:墨日陽光

譯文鏈接: http://blog.jobbole.com/63628/

責任編輯:閆佳明 來源: blog.jobbole
相關推薦

2010-11-24 10:35:40

Objective-C

2014-04-15 11:27:50

C++開發者Objective-C核心語法

2014-04-01 10:50:42

iOS開發runtimeObjective-C

2011-08-03 16:22:05

Objective-C CodeBlocks

2011-04-08 10:51:17

Objective-CiOS

2011-08-10 18:07:29

Objective-C反射

2011-05-11 15:58:34

Objective-C

2013-06-20 10:40:32

Objective-C實現截圖

2013-03-27 12:54:00

iOS開發Objective-C

2011-05-11 11:20:26

Objective-C

2011-08-16 17:43:47

Objective-C內存管理Autorelease

2011-07-29 15:47:21

iPhone開發 Objective- C

2011-07-27 16:18:42

Objective-c 協議

2011-08-04 15:55:50

Windows 編譯 Objective-

2014-09-26 09:49:48

SwiftObjective-C

2011-07-25 17:31:49

iPhone Objective-

2010-09-01 09:19:33

Objective-CiPhone開發iPhone

2011-07-28 15:11:23

iOS Objective-

2011-07-07 17:04:33

iPhone Action Objective-

2012-04-23 11:00:56

iOS開發Objective-CJavaScript
點贊
收藏

51CTO技術棧公眾號

国产大片中文字幕| 毛片一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 日韩中文字幕网址| 97热在线精品视频在线观看| 草草影院第一页| 久久夜夜久久| 精品久久久久久国产| 亚洲欧洲久久| 久久成年人网站| 在线免费看av| 免费av网站大全久久| 亚洲欧美日韩国产中文| 亚洲午夜精品一区| 岛国在线视频网站| 国产精品美女久久久久aⅴ| 亚洲xxxxx性| 久久99精品波多结衣一区| 久久精品一级| 亚洲综合成人在线视频| 欧美精品成人一区二区在线观看| 97人妻精品一区二区三区| 国产亚洲毛片在线| 欧美肥婆姓交大片| 精品一区二区三孕妇视频| 日本一区二区三区四区五区| 97视频一区| 欧日韩精品视频| 日韩a∨精品日韩在线观看| a黄色在线观看| yy6080午夜| 亚洲精品18p| 亚洲综合精品| 欧美大片在线影院| 免费看的黄色录像| 精品高清久久| 日本网站在线观看一区二区三区| 这里只有精品视频| 黄色性生活一级片| 91综合久久爱com| 欧美日韩国产片| 日韩欧美黄色大片| 男人皇宫亚洲男人2020| 精品国产91久久久久久| 欧美乱做爰xxxⅹ久久久| 国产在线观看免费麻豆| 18成人在线观看| 一区不卡字幕| 日本高清视频在线播放| 国产精品久久久久aaaa樱花 | 国产午夜精品无码| 你懂的成人av| 欧美国产日韩一区二区在线观看| 69av视频在线| 国内成人在线| 国内精品一区二区三区四区| 日本亚洲色大成网站www久久| 精品二区久久| 欧美性受xxxx白人性爽| 婷婷激情五月网| 美女91精品| 国产极品jizzhd欧美| 999视频在线| 乱一区二区av| 97欧洲一区二区精品免费| www.97av| 99久久精品一区二区| 免费看成人片| a中文在线播放| 亚洲色图在线看| 国产精品无码免费专区午夜| 草草视频在线| 色婷婷综合中文久久一本| 美女网站色免费| 精品久久免费| 亚洲精品乱码久久久久久按摩观| 波多野结衣办公室33分钟| 国产真实有声精品录音| 久久艳片www.17c.com| 久久久久久久久毛片| 亚洲少妇一区| 国产日韩在线视频| 国产男男gay网站| 99天天综合性| 亚洲欧洲一区二区福利| 日韩经典av| 色狠狠桃花综合| 亚洲免费在线播放视频| 国产在线播放精品| 在线视频欧美性高潮| 免费人成在线观看| 三级一区在线视频先锋| 91久久久久久久| 天堂а√在线8种子蜜桃视频| 亚洲国产精品黑人久久久| 屁屁影院ccyy国产第一页| 色在线中文字幕| 欧美一区二区福利在线| www.色天使| 中文字幕亚洲精品乱码| 欧美综合在线第二页| 国产剧情久久久| 久久综合丝袜日本网| 超碰在线免费观看97| 另类专区亚洲| 亚洲精品一区二区三区影院| 成人一级片免费看| 老鸭窝毛片一区二区三区| 91在线直播亚洲| 成人高清免费观看mv| 亚洲一区二区三区四区在线| 国产天堂在线播放| 国产精品毛片av| 日韩中文字幕在线免费观看| 亚洲午夜18毛片在线看| 高清国产一区二区| 少妇熟女一区二区| 国产亚洲人成a在线v网站| 亚洲男人的天堂在线播放| 欧美一级高潮片| 国产一区二区三区免费播放| 亚洲电影一二三区| 高清不卡av| 日韩精品中文字幕有码专区| 精品在线视频免费观看| 国产一区二三区好的| 亚洲欧美日韩综合一区| 日韩免费va| 亚洲精品日韩欧美| 国产无人区码熟妇毛片多| 欧美91大片| 欧美久久成人| 国产亚洲美女久久| 亚洲欧美在线观看视频| 成人永久免费视频| 97超碰在线视| 视频一区中文字幕精品| 久久视频精品在线| 国产美女主播在线观看| 亚洲欧洲av色图| 亚洲一区日韩精品| 日韩一区二区中文| 国产精品国产亚洲伊人久久| 男生女生差差差的视频在线观看| 欧美日韩另类字幕中文| 亚洲调教欧美在线| 中文久久精品| 日本精品二区| 成人福利一区二区| 色av吧综合网| 国产精品久久久久久无人区| 国产精品素人视频| 嫩草视频免费在线观看| 99精品视频精品精品视频| 国产区精品在线观看| 麻豆传媒在线免费| 日韩精品一区二区三区中文不卡| 99视频只有精品| 国产老女人精品毛片久久| 可以在线看黄的网站| 91午夜精品| 欧美一区二区.| jizzjizz在线观看| 88在线观看91蜜桃国自产| 欧美老熟妇一区二区三区| 国产高清精品网站| 欧美日韩不卡在线视频| 亚洲精品推荐| 国产日韩欧美中文| 1区2区3区在线视频| 欧美精品一区二区久久久| 日韩美女视频网站| 国产亚洲精品资源在线26u| av网站在线不卡| 亚洲综合五月| 久久av一区二区三区漫画| 亚洲mmav| 欧美另类在线播放| 亚洲欧美色视频| 欧美人xxxx| 精品一区免费观看| 欧美国产欧美综合| 苍井空张开腿实干12次| 久久亚洲电影| 免费观看国产视频在线| 亚洲免费成人av在线| 国产美女91呻吟求| 1234区中文字幕在线观看| 国产亚洲免费的视频看| 亚洲精品911| 欧美综合色免费| 免费无遮挡无码永久在线观看视频| 久久久美女毛片| ass极品水嫩小美女ass| 久久看片网站| 成人在线视频一区二区三区| 国产精品片aa在线观看| 91手机在线观看| 91精品店在线| 91高清免费在线观看| 成人福利片网站| 亚洲欧美中文日韩在线| 亚洲精品人妻无码| 欧美日韩精品久久久| 亚洲黄色小说图片| 亚洲一区二区三区四区不卡| 少妇视频在线播放| 91香蕉视频在线| 波多野结衣办公室双飞| 九九视频精品免费| 91蝌蚪视频在线观看| 亚洲人体大胆视频| 91视频成人免费| 日韩美女一区二区三区在线观看| 久久精品第九区免费观看| 日韩av综合| 91精品国产综合久久香蕉最新版 | zzzwww在线看片免费| 日韩中文字幕网| www.成人.com| 精品亚洲一区二区三区| 亚洲国产精品久久人人爱潘金莲 | 国产精品99久久久久久人| 超碰激情在线| 欧美日本黄视频| 精品国产99久久久久久| 这里只有视频精品| 成年在线观看免费人视频| 国产亚洲精品高潮| 日本一级在线观看| 亚洲免费高清视频| 日产精品久久久久久久性色| 亚洲精品第一页| 日批免费在线观看| 欧美精品一区二区三区视频| 亚洲欧美黄色片| 亚洲国产成人久久综合一区| www.色亚洲| 精品国产污污免费网站入口 | 亚洲激情一区| 伊人久久大香线蕉综合75| 成人网18免费网站| 日本一区二区三不卡| 国产不卡一区| 欧美一区二区三区四区五区六区| 欧美人妖视频| 久久久久久久久久久一区| 欧美aaaaa级| 久久久久免费网| 国产99久久久国产精品成人免费 | 欧美日韩一区自拍| 欧美黄网在线观看| 欧美日韩伊人| 久无码久无码av无码| 亚洲电影av| 精品久久久久久最新网址| 又黄又爽又色的视频| 韩国av一区二区三区四区| 性欧美在线视频| 国产乱子轮精品视频| 中国男女全黄大片| 99在线精品视频| 久久精品国产亚洲av久| 国产精品无遮挡| 精品人体无码一区二区三区| 国产精品伦理一区二区| 波多野结衣家庭教师| 亚洲国产欧美日韩另类综合| 欧美啪啪小视频| 欧美吞精做爰啪啪高潮| 国产情侣在线播放| 欧美一区二区三区人| 动漫av一区二区三区| 日韩av在线电影网| 黄网在线观看| 欧美大尺度在线观看| 中文字幕影音在线| 国产精品色婷婷视频| 中文字幕久久精品一区二区| 久久久久久精| 欧美丰满日韩| 男人添女荫道口图片| 日韩电影在线一区二区三区| a级大片免费看| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 大桥未久在线播放| 国产999在线| 136福利精品导航| 日韩av电影免费在线观看| 亚洲精品91| www.亚洲天堂网| 国产老肥熟一区二区三区| 97超碰在线资源| 一区二区三区国产| 欧美成人精品网站| 亚洲成人教育av| 免费黄色在线观看| 欧美做受高潮电影o| 无人区乱码一区二区三区| 午夜精品一区二区三区在线观看 | 熟妇人妻va精品中文字幕| 国产原创一区二区三区| 性久久久久久久久久| 亚洲精品视频自拍| 男操女视频网站| 亚洲成人精品视频| 男人天堂久久久| 国产成人一区三区| 久久精品国产亚洲5555| 黄色网络在线观看| 免费日本视频一区| 久久精品国产亚洲av麻豆| 亚洲国产日日夜夜| 96亚洲精品久久久蜜桃| 国产亚洲精品成人av久久ww| 日本蜜桃在线观看视频| 成人免费看片网站| 婷婷综合五月| 亚洲欧美自拍另类日韩| 久久久精品欧美丰满| 亚洲国产精一区二区三区性色| 欧美日本高清视频在线观看| 国产免费av高清在线| 91av在线播放视频| 成人午夜网址| 国产一区二区三区在线免费| 久久av资源网| 亚洲天堂精品一区| 性感美女一区二区在线观看| 国产精品亚洲精品| 国产一区二区观看| 丝袜老师办公室里做好紧好爽| 成人免费毛片高清视频| 日本精品人妻无码77777| 欧美日韩三级视频| 18免费在线视频| 国产精品久久久久久影视| 狠狠综合久久av一区二区蜜桃| 青青草原成人网| 久久综合色婷婷| 黄色av一级片| 亚洲日韩中文字幕在线播放| 欧洲av不卡| 色一情一乱一伦一区二区三欧美| 石原莉奈一区二区三区在线观看| 精品人妻无码一区二区三区换脸| 一本一道久久a久久精品| 久草在线网址| 国产精品久久久久久一区二区| 久久大综合网| 亚洲男人天堂2021| 一区二区三区丝袜| 日本黄色三级视频| 1769国产精品| 国内精品久久久久久久影视简单 | 深夜福利一区二区三区| 黄色片免费在线观看视频| av在线这里只有精品| 国产又大又黄视频| 国产亚洲欧美日韩精品| 色狠狠一区二区三区| 8x8x华人在线| 中文字幕成人免费视频| 一区二区不卡在线播放| 天堂av一区二区三区| 日本在线观看天堂男亚洲| 成人在线免费视频观看| 中文字幕无码毛片免费看| 亚洲成a人在线观看| 久草在线青青草| 91精品视频专区| 亚洲乱码视频| 国产又粗又硬视频| 日韩亚洲欧美成人一区| 亚洲精品**中文毛片| 一区二区三区在线视频看| 国产91精品一区二区麻豆网站| 天堂а√在线中文在线新版 | 第84页国产精品| 中文字幕一区二区三区最新| 国产福利电影一区二区三区| 久久国产精品免费看| 久久久国产精品一区| 日本三级久久| 福利视频999| 色综合中文字幕国产| av黄在线观看| 欧美日韩国产一二| 国产精品一品视频| 不卡av电影在线| 欧美精品在线观看| 欧美午夜精品一区二区三区电影| 亚洲av毛片在线观看| 色综合天天视频在线观看 | 国产精品扒开腿爽爽爽视频| 午夜久久tv| 91麻豆精品久久毛片一级| 日韩av在线播放资源| 亚洲国产中文在线| 中文字幕中文在线|