iOS開發筆記(4) 反射

2021-07-04 01:26:16 字數 2705 閱讀 8637

反射的強大之處在於,我們可以將物件與依賴物件之間完全解耦,建立物件可以不引用標頭檔案,操作屬性、方法可以不依賴於物件,操作物件可以不依賴於型別,操作型別可以不依賴於引用等等等等。最直觀的效果是,即使不引用標頭檔案亦可操作型別、物件及對應屬性與方法。

借助強大的runtime特性,在ios平台上我們也得以實現反射。

//使用前需要先引用runtime標頭檔案

#import

在這裡,我們建立乙個示例型別ipzclassone並宣告四個有代表性的方法。

@inte***ce

ipzclassone : nsobject

+ (void) classmethod; //型別方法

+ (ipzclassone*) getsingleleton; //單例

- (void) instancemethod; //例項方法

- (void) onfinshedhandler:(nsstring *) completehandler;//含引數方法

@end

獲取型別分為兩種,通過物件獲取和通過型別名稱獲取。

這裡需要注意的是,如果名稱錯誤或者該型別不存在的話也會有可能型別反射失敗。

型別獲取成功時如下圖:

型別獲取失敗時如下圖:

型別是一種特殊的物件,從圖中可以看出黨獲取型別失敗時型別物件位址為0x0,因此我們可以通過該物件的位址來判斷是否獲取成功。

if(class==0x0)
在ios中例項化物件的方法同樣有兩種:單例或者init方法。

sel classselector=nsselectorfromstring(@"getsingleleton");

//classselector=@selector(getsingleleton);

if ([class

respondstoselector:classselector])

單例實現中上面這種呼叫selector的方法是比較安全的方法,在此之外還有一種直接呼叫的方法,即:id instance=[class getsingleleton];然而直接使用的話編譯器會報未找到該方法: no known class method for selector 『getsingleleton』,此種情況只需宣告或定義乙個同名稱空方法即可

通過反射到的型別例項化物件同樣有失敗的可能,判斷成功或失敗的方法同上。

上面已經講了單例亦即型別方法的呼叫,例項物件的呼叫方法與之相同。

sel  instanceselector=nsselectorfromstring(@"instancemethod");

instanceselector=@selector(instancemethod);

if ([instance respondstoselector:instanceselector])

以及: [instance instancemethod];

然而,performselector這種方式只能呼叫無參方法,有參方法仍需直接呼叫。

在直接呼叫方法之前,我們可以宣告乙個協議。

@protocol

ipzclassone

@optional

+(void) classmethod;

+(id) getsingleleton; //返回值為id

-(void) instancemethod;

-(void) onfinshedhandler:(id) completehandler;//引數宣告為id

@end

此外,我們還可以通過反射在執行時獲取例項方法列表及其內容。(型別方法列表無法獲取,只能根據名稱獲取單個方法)

獲取例項方法:

u_int count;

method* methods=class_copymethodlist

(class, &count);

//獲取所有例項方法

for (int i = 0; i < count ; i++)

free(methods);

u_int count;

objc_property_t* properties = class_copypropertylist(class, &count);//獲取屬性列表

nsmutablearray* propertyarray = [nsmutablearray arraywithcapacity:count];

for (int i = 0; i < count ; i++)

free(properties);

for (nsstring *name in propertyarray)

ios開發筆記 4

title ios開發筆記 4 date 2016 02 21 01 11 55 categories ios tags ios,筆記 一般此問題 都是由inte ce build與 中iboutlet的連線所引起的。可能是在 中對iboutlet的名稱進行了修改,導致inte ce build中的...

iOS開發筆記

1.預設快取策略下 useprotocolcachepolicy 對於靜態資源的訪問,請求頭會自動帶上 if none match if modified since 快取方面,響應頭帶有 last modified etag 兩個字段 儘管charles抓包結果為304,但是 urlsession...

IPLE 開發筆記 4

10 月 16 日 經過總結得出了一點api設計經驗,即傳識別符號,不穿指標。最初的設計 void demoapi pbyte pfiledata,int width,int height 改良後的設計 void demoapi handle hfile 這樣的好處是,我們只需要在函式外部管理乙個檔...