成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解析Objective-C反射

移動開發 iOS
Objective-C有一個定位危機:它是解釋型語言還是編譯語言?運行時很大程度上是動態的。和C++不同,Objective-C是運行時綁定的。這也是為什么我們可以在實現時定義一個從來沒有在頭文件中聲明的方法,

Objective-C反射是本文要介紹的內容,我第一次接觸Java的時候就覺得整個反射包都很新穎,它使得Java和解釋型的腳本語言更接近了,與此同時也拉開了和主流的C和C++的距離。

在運行時可以窺視到一個對象的類元數據真的很不可思議,盡管這些可能不會在日常應用編程中經常使用到。從Java轉到Objective-C的程序員應該會樂見Objective-C也支持反射。實際上,Objective-C有很多諸如動態改變類定義以及創建一個新類的動態特征。

不過很難說這些功能有多大的作用,這也讓我覺得Objective-C是一個有些臃腫的語言。在我看來,Objective-C有一個定位危機:它是解釋型語言還是編譯語言?運行時很大程度上是動態的。和C++不同,Objective-C是運行時綁定的。這也是為什么我們可以在實現時定義一個從來沒有在頭文件中聲明的方法,或者通過Category擴展類。不幸的是由于這種臃腫使得找到一些日常編程中有用的東西變得困難,本文就是要去發現其中的一些“寶藏”。

根類NSObject

大部分(如果不是全部的話)的動態反射支持來自NSObject 類。和Java的Object對象類似,NSObject是所有類(除了一些很少見的例外)的根類。所以所有你寫的類應該都可以支持反射。需要指出的所有這些的反射支持并不是Objective-C語言的一部分,而是源于NS*的運行時環境。這也是為什么這些東西感覺被加入一些額外東東的原因。因為它就是被加入了額外東東。

獲取類的元數據 通過調用如下的類方法你就可以獲取到一個對象的類的元數據:

  1. Class c = [self class]; 

該方法既是實例方法也是類方法。它返回一個帶有很多神奇信息的C構造體,比如實例變量、方法等等。所有這些和java.lang.reflect包相比都有些過時了,利用Objective-C訪問這些信息的接口看起來很復雜。這可能就是故意設計成這樣來“過濾”一些不合格的程序員。目前為止我唯一使用這些的地方就是為下面將要介紹的isKindOfClass:方法提供參數。一直以來我都不需要去窺視類結構的內容。

動態方程調用我已經在方法調用一文中介紹了反射的一個方面。這使得你可以在運行時創建一個方法調用并傳入參數。這和Java中使用java.lang.reflect.Method類很相似。

檢查繼承關系

Java有一個名為instanceof的操作符可以用來檢查一個對象是否是一個特定類或者接口的實例。 Objective-C也有類似的功能,就是通過isKindOfClass:方法。isKindOfClass:會在消息接收者是指定類及其子類的實例的情況下返回YES。比如有一個關聯的指針數組,這樣就可以根據其類型進行不同的操作:

  1. for(BaseClass* base in myArray) {  
  2. if([base isKindOfClass:[ClassOne class]]) {  
  3. // do stuff specific to ClassOne  
  4. } else if([base isKindOfClass:[ClassTwo class]]) {  
  5. // do stuff specific to ClassTwo  
  6. } else if([base isKindOfClass:[ClassThree class]]) {  
  7. // do stuff specific to ClassThree }  
  8. // etc } 

如果你需要一個精確的類匹配,而不是匹配任何繼承類,你就可以使用isMemberOfClass:方法。

檢查是否符合協議 和實例檢查類似,你可以測試一個對象是否符合特定的協議。Java在類和接口的情況下都使用instanceof 方法搞定,但Objective-C使用了一個更笨重的方法。在測試是否合規的時候,應該使用conformsToProtocol:方法:

  1. BOOL conforms = [obj conformsToProtocol:@protocol(MyInterface)]; 

檢查方法是否存在對于像我這樣Java和C++的老手來說,如果不知道一個對象是否實現了一個方法就很奇怪了。但是Objective-C的類很大程度上是動態的,你就需要檢查你需要的方法是否存在。這就需要respondsToSelector:方法。如下代碼就是檢查接收者是否實現(或者繼承)了指定方法:

  1. if([obj respondsToSelector:@selector(aMethod:)])   
  2. { // it's there, so we can call it [obj aMethod:YES];  
  3.  } 

當然,利用Objective-C反射你可以做更多的事情,這里我只是嘗試談談反射機制最常見的應用。如果你需要在你的軟件中加入核心的動態特性,你就需要熟悉下這些文檔:

  1. Runtime Programming Guide: Introduction Runtime Reference 

小結:解析Objective-C反射的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2013-03-27 12:54:00

iOS開發Objective-C

2011-08-05 15:46:32

Objective-C 程序設計

2011-08-11 17:39:25

Objective-C筆試題

2011-07-29 16:08:31

Objective-C 內存

2011-08-15 14:02:36

Objective-C

2013-06-20 10:40:32

Objective-C實現截圖

2011-05-11 15:58:34

Objective-C

2011-05-11 11:20:26

Objective-C

2011-08-03 16:55:05

Objective-C 代理

2011-08-04 09:35:09

Objective-C 編碼規范

2014-04-30 10:16:04

Objective-CiOS語法

2014-06-25 14:02:59

Objective-CKVO

2012-03-07 13:43:59

Objective-C

2011-07-29 16:16:30

Objective-c block

2011-07-08 13:49:46

Objective-C UUID

2012-06-15 09:47:48

Objective-CCategory

2011-08-17 10:58:59

Objective-C構造函數

2011-08-04 15:52:48

Objective-C HTML

2011-05-11 13:54:08

Objective-C

2011-05-11 15:45:50

內存管理Objective-C
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 自拍偷拍中文字幕 | 亚洲精品视频在线看 | 九九热在线视频观看这里只有精品 | 精品99爱视频在线观看 | 日韩成人在线观看 | 欧美日韩久久 | а√中文在线8 | 99精品国产一区二区三区 | 精品亚洲一区二区三区 | 久久这里只有精品首页 | 亚洲香蕉在线视频 | 亚洲欧美精品在线观看 | 精久久久久 | 综合色在线 | 天天爽天天干 | av国产精品毛片一区二区小说 | 欧美一区二区三区的 | 亚洲性综合网 | caoporn免费 | 中文日韩在线视频 | 91精品中文字幕一区二区三区 | 又黑又粗又长的欧美一区 | 精品久久久久一区二区国产 | 天天操天天射综合网 | 精品视频一区二区三区 | 国产在线拍偷自揄拍视频 | 一级毛片在线播放 | 免费观看黄 | 亚洲一区欧美 | 国产精品欧美一区二区三区不卡 | 综合网中文字幕 | 黄色免费网 | 亚洲成人免费观看 | 亚洲欧美一区二区三区视频 | 91精品国产91久久综合桃花 | 自拍偷拍3p| 一级黄色绿像片 | 日本中出视频 | 亚洲二区在线观看 | 色视频在线观看 | 五月综合久久 |