runTime復習筆記

一.setter/getter方法

objc_setAssociatedObject

objc_getAssociatedObject

在category(分類)中只是聲明屬性 ? 沒有實現(xiàn)setter/getter方法,并且直接重寫setter/getter方法也不能實現(xiàn),在編譯期不會報錯,但在運行時會crash,

重寫setter/getter方法時需要用運行時關聯(lián)屬性

@dynamic修飾的屬性不會自動生成setter/getter/ivar ? 所以也需要自定義setter/getter方法

正確的重寫方法為 ? ? ?例:

const char *nameKey;

- (NSString *)setName:(NSString *)name {

//objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

//<#id object#>要綁定的類 setter方法中直接就是 self

//<#const void *key#> key值 ? 不能重復 ?如外邊聲明的nameKey

//<#id value#> 要綁定的數(shù)據(jù) 對象類型 基本數(shù)據(jù)類型要轉(zhuǎn)為NSNumber?如:name;

//<#objc_AssociationPolicy policy#> 內(nèi)存管理修飾符:retain/copy/assign

objc_setAssociatedObject(self, nameKey, name,OBJC_ASSOCIATION_COPY_NONATOMIC)

}

- (NSString *)name{

//objc_getAssociatedObject(<#id object#>, <#const void *key#>)

//<#id object#>要綁定的類 getter方法中直接就是 self

//<#const void *key#> key值 ? 不能重復 ?如外邊聲明的nameKey

// ? 直接返回運行時綁定的數(shù)據(jù) ?如果屬性為基本數(shù)據(jù)類型注意轉(zhuǎn)換類型

returnobjc_getAssociatedObject(self, nameKey)

}

二.查看更改類中的屬性 ?變量 ?協(xié)議 方法 等 ? 方法都是class開頭.

添加方法:

class_addMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>, <#IMP imp#>, <#const char *types#>)

//<#__unsafe_unretained Class cls#> 類 例:[Person class]

//<#SEL name#> ?方法選擇器

//<#IMP imp#> ? 方法實現(xiàn)的指針, 可用block實現(xiàn)創(chuàng)建imp_implementationWithBlock(<#block#>)

也可以找現(xiàn)有方法class_getMethodImplementation

//<#const char *types#> 方法返回類型 例 v@: 返回void 無參 ?i@:@ 返回int 有一個參

添加屬性:

objc_property_attribute_t type = {"T","NSUInterger"};

objc_property_attribute_t memory = {"R",""};

objc_property_attribute_t lock = {"N",""};

objc_property_attribute_t backName = {"V",[@"_age" UTF8String]};

objc_property_attribute_t attrs[] = {backName, memory, lock, type};

class_addProperty([Personclass],"age", attrs,4);

檢查屬性.成員變量.方法.協(xié)議等

unsignedintcount;

objc_property_t *property =class_copyPropertyList([Personclass], &count);

for(inti =0; i

objc_property_t pro = property[i];

constchar *name =property_getName(pro);

NSLog(@"%s",name);

}

方法(屬性...)交換,刪除,修改 獲取類信息等都可以在runtime 完成 ? 具體詳情后續(xù)在學習.

三.unrecognized selector異常處理

這種異常是調(diào)用的方法沒有實現(xiàn)拋出的異常.Objective-C中方法調(diào)用的實質(zhì)是消息發(fā)送.如[objc method]的本質(zhì)是轉(zhuǎn)化為objc_msgSend(objc,@selected(method));選擇器開始在當前實例對象的isa所指向的當前類對象中找方法,當前類對象存有對象方法列表,成員變量列表,屬性列表,并且有一個superClass指針指向父類,一個isa指針指向元對象,元類內(nèi)部存放的是類方法列表,元類的isa指針指向父元類,根元類的指針指向自己,根類對象(NSObject)的isa指針指向nil.

每個 Objective-C 對象都有相同的結(jié)構(gòu)


方法調(diào)用時 先找當前類對象內(nèi)的方法,如果沒有找父類的同名方法,依次向上查找,如果沒有找到就會拋出unrecognized selector異常,在runtime中給了三次機會作為彌補不會crash:

1.Method resolution

objc運行時會調(diào)用+resolveInstanceMethod:或者+resolveClassMethod:,讓你有機會提供一個函數(shù)實現(xiàn)。如果你添加了函數(shù),那運行時系統(tǒng)就會重新啟動一次消息發(fā)送的過程,否則 ,運行時就會移到下一步,消息轉(zhuǎn)發(fā)(Message Forwarding)。

id recoverMethodIMP(id self,SEL _cmd) {

NSLog(@"%s:動態(tài)添加的方法",__FUNCTION__);

return@"1";

}

+ (BOOL)resolveClassMethod:(SEL)sel {

class_addMethod(self, sel, (IMP)recoverMethodIMP,"@:@");

return YES;

}

+ (BOOL)resolveInstanceMethod:(SEL)sel{

class_addMethod(self, sel, (IMP)recoverMethodIMP,"@:@");

returnYES;

}

2.Fast forwarding

如果目標對象實現(xiàn)了-forwardingTargetForSelector:,Runtime 這時就會調(diào)用這個方法,給你把這個消息轉(zhuǎn)發(fā)給其他對象的機會。 只要這個方法返回的不是nil和self,整個消息發(fā)送的過程就會被重啟,當然發(fā)送的對象會變成你返回的那個對象。否則,就會繼續(xù)Normal Fowarding。

- ?(id)forwardingTargetForSelector:(SEL)aSelector{

return[ superforwardingTargetForSelector:aSelector];

}

3.如果上一步返回的對象未能完成消息發(fā)送的方法,它會發(fā)送-methodSignatureForSelector:消息獲得函數(shù)的參數(shù)和返回值類型。如果-methodSignatureForSelector:返回nil,Runtime則會發(fā)出-doesNotRecognizeSelector:消息,程序這時就掛了,如果返回了一個函數(shù)簽名,Runtime就會創(chuàng)建一個NSInvocation對象并發(fā)送-forwardInvocation:消息給目標對象。

- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector{

id sig = [super methodSignatureForSelector:aSelector];

sig = [NSMethodSignature signatureWithObjCTypes:"@@:"];

returnsig;

}

- (void)forwardInvocation:(NSInvocation*)anInvocation{

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,051評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,333評論 0 7
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,249評論 0 9
  • 一、裴實 發(fā)型師捧著立春的頭很專業(yè)的看一眼說,小姐,以我操刀多年的經(jīng)驗來看,你適合卷發(fā),最好是大波浪,配上你的小臉...
    玉樓人醉閱讀 1,185評論 7 10
  • 春意將消,酷暑悄襲,想要抓住最后一絲春光,用來彌補心中的缺憾。四年將盡,臨了卻越發(fā) 到的旅行。 早早起了床,懷著興...
    曹李漫閱讀 340評論 0 0

友情鏈接更多精彩內(nèi)容