iOS高級(jí)開發(fā)runtime那點(diǎn)事實(shí)戰(zhàn)(1)

runtime 給類別添加屬性淺析

很多時(shí)候因?yàn)樾枨笙胫o一個(gè)類添加屬性,就是給一個(gè)類添加成員變量了,這樣子方便了用這個(gè)類的時(shí)候响巢,有了自己添加的屬性盗冷,做什么事都是 信手捏來了均澳。

源碼

 

#import <Foundation/Foundation.h>
#import <objc/runtime.h> //千萬別忘記添加哦
@interfaceNSObject(FY)
@property(nonatomic,copy)NSString* name;//像平時(shí)一樣的添加屬性
@end

下面是在.m中實(shí)現(xiàn)的

staticvoid* FYKeyName = (void*)"FYKeyName";//聲明這個(gè)變量要存儲(chǔ)的key的名字
@implementationNSObject(FY)
- (void)setName:(NSString*)name{
objc_setAssociatedObject(self, FYKeyName, name, OBJC_ASSOCIATION_COPY);//把這個(gè)值存儲(chǔ)起來類型是copy曲掰,值是name蛔琅,存儲(chǔ)的鍵值是"FYKeyName",存儲(chǔ)到self的屬性里面
}
- (NSString*)name{
returnobjc_getAssociatedObject(self, FYKeyName);//獲取self的key為FYKeyName的值
}
@end

到此為止這個(gè)屬性已經(jīng)添加完成了胎许。
其實(shí)為毛添加屬性啊,我們公司的按鈕不能連續(xù)點(diǎn)擊罗售,是所有按鈕辜窑。。寨躁。沒錯(cuò)是all not some穆碎。我問Google大神了,搜到了消息是runtime解決問題职恳,但是沒找到如何解決所禀。在我努力尋找方面。。色徘。恭金。一萬字。褂策。
終于知道runtime是運(yùn)行時(shí)横腿,什么是運(yùn)行時(shí)呢?就是我們寫的OC代碼會(huì)讓runtime翻譯并且執(zhí)行斤寂,runtime是一套比較底層的純C語言API, 屬于1個(gè)C語言庫, 包含了很多底層的C語言API耿焊。
在我們平時(shí)編寫的OC代碼中, 程序運(yùn)行過程時(shí), 其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼, runtime算是OC的幕后工作者。
所以給類添加屬性就派上用場(chǎng)了扬蕊,我解決思路是這樣子的搀别,給按鈕添加類別就是點(diǎn)擊事件間隔,執(zhí)行點(diǎn)擊事件的時(shí)候判斷一下是否時(shí)間到了尾抑,如果時(shí)間不到歇父,那么攔截點(diǎn)擊事件。
怎么攔截點(diǎn)擊事件呢再愈?
其實(shí)點(diǎn)擊事件在runtime里面是obj發(fā)送消息榜苫,我們可以把要發(fā)送的消息的SEL 和自己寫的SEL交換一下,然后在自己寫的SEL里面判斷是否執(zhí)行點(diǎn)擊事件翎冲〈共牵【有點(diǎn)繞】
代碼:

#import
#import
@interfaceUIControl(FY)
@property(nonatomic,assign)NSTimeIntervalacceptEventInterval;
@property(nonatomic)BOOLignoreEvent;
@end
@implementationUIControl(FYControl)
staticconstchar*UIControl_acceptEventInterval="UIControl_acceptEventInterval";
staticconstchar*UIControl_ignoreEvent="UIControl_ignoreEvent";
@end
@implementationUIControl(FY)
- (void)setAcceptEventInterval:(NSTimeInterval)acceptEventInterval
{
objc_setAssociatedObject(self,UIControl_acceptEventInterval, @(acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSTimeInterval)acceptEventInterval {
return[objc_getAssociatedObject(self,UIControl_acceptEventInterval) doubleValue];
}
-(void)setIgnoreEvent:(BOOL)ignoreEvent{
objc_setAssociatedObject(self,UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_ASSIGN);
}
-(BOOL)ignoreEvent{
return[objc_getAssociatedObject(self,UIControl_ignoreEvent) boolValue];
}
+(void)load {
Method a = class_getInstanceMethod(self,@selector(sendAction:to:forEvent:));
Method b = class_getInstanceMethod(self,@selector(_sendAction:to:forEvent:));
method_exchangeImplementations(a, b);//交換方法
}
- (void)_sendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event
{
if(self.ignoreEvent)return;
if(self.acceptEventInterval>0)
{
self.ignoreEvent=YES;
[selfperformSelector:@selector(setIgnoreEventWithNo)  withObject:nilafterDelay:self.acceptEventInterval];
}
[self_sendAction:action to:target forEvent:event];
}
-(void)setIgnoreEventWithNo{
self.ignoreEvent=NO;
}
@end

用的時(shí)候很好用的

-(void)click{
btn =[[UIButton alloc]initWithFrame:CGRectMake(100,100,100,40)];
[btnsetTitle:@"btn"forState:UIControlStateNormal];
[btnsetTitleColor:[UIColor redColor]forState:UIControlStateNormal];
btn.touchTimeValue =3;
[self.viewaddSubview:btn];
[btnaddTarget:selfaction:@selector(objcName)forControlEvents:UIControlEventTouchUpInside];
}


輸出:2016-03-1713:14:20.365runTimeObj[9297:2669428] 測(cè)試
2016-03-1713:14:23.717runTimeObj[9297:2669428] 測(cè)試
2016-03-1713:14:26.876runTimeObj[9297:2669428] 測(cè)試

這個(gè)例子是利用了兩個(gè)參數(shù),一個(gè)參數(shù)Bool判斷是否往下執(zhí)行抗悍,一個(gè)時(shí)間用來修改Bool的值驹饺,最后就是執(zhí)行方法b。有些同學(xué)納悶缴渊,這執(zhí)行方法b赏壹,不是執(zhí)行自身方法嗎?難道不是遞歸衔沼?其實(shí)不是蝌借,在load函數(shù)里面已經(jīng)把a(bǔ),b方法交換了指蚁。
這樣子就可以操作一些系統(tǒng)方法了菩佑。后續(xù)還會(huì)出runtime在項(xiàng)目中的實(shí)際應(yīng)用。
轉(zhuǎn)自:http://fgyong.cn/2016/03/17/iOS%E9%AB%98%E7%BA%A7%E5%BC%80%E5%8F%91runtime%E9%82%A3%E7%82%B9%E4%BA%8B%E5%AE%9E%E6%88%98(1)/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凝化,一起剝皮案震驚了整個(gè)濱河市稍坯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搓劫,老刑警劉巖劣光,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袜蚕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绢涡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門遣疯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雄可,“玉大人,你說我怎么就攤上這事缠犀∈唬” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵辨液,是天一觀的道長虐急。 經(jīng)常有香客問我,道長滔迈,這世上最難降的妖魔是什么止吁? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮燎悍,結(jié)果婚禮上敬惦,老公的妹妹穿的比我還像新娘。我一直安慰自己谈山,他們只是感情好俄删,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奏路,像睡著了一般畴椰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸽粉,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天斜脂,我揣著相機(jī)與錄音,去河邊找鬼潜叛。 笑死秽褒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的威兜。 我是一名探鬼主播销斟,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椒舵!你這毒婦竟也來了蚂踊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤笔宿,失蹤者是張志新(化名)和其女友劉穎犁钟,沒想到半個(gè)月后棱诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涝动,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年迈勋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醋粟。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡菇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出米愿,到底是詐尸還是另有隱情厦凤,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布育苟,位于F島的核電站较鼓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏违柏。R本人自食惡果不足惜博烂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勇垛。 院中可真熱鬧脖母,春花似錦、人聲如沸闲孤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讼积。三九已至肥照,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勤众,已是汗流浹背舆绎。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留们颜,地道東北人吕朵。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像窥突,于是被迫代替她去往敵國和親努溃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • @synthesize和@dynamic分別有什么作用?@property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是 @synthes...
    筆筆請(qǐng)求閱讀 515評(píng)論 0 1
  • 猜想runloop內(nèi)部是如何實(shí)現(xiàn)的?一般來講凳谦,一個(gè)線程一次只能執(zhí)行一個(gè)任務(wù)忆畅,執(zhí)行完成后線程就會(huì)退出。如果我們需要一...
    筆筆請(qǐng)求閱讀 423評(píng)論 0 0
  • 《招聘一個(gè)靠譜的 iOS》—參考答案(下)說明:面試題來源是微博@我就叫Sunny怎么了的這篇博文:《招聘一個(gè)靠譜...
    筆筆請(qǐng)求閱讀 318評(píng)論 0 0
  • 我近期的目標(biāo)是讓兒子快樂學(xué)習(xí)、提高的學(xué)習(xí)熱情和書寫的認(rèn)真剔交,提升學(xué)習(xí)成績,各科成績達(dá)到95分改衩,為小升初打下堅(jiān)實(shí)的基礎(chǔ)...
    歸韻閱讀 166評(píng)論 3 4
  • 最近看了極客公園里一篇關(guān)于頭條新聞CEO的文章岖常,頭條新聞的做法看似跟其他平臺(tái)一樣,聚攏+分發(fā)葫督,把各個(gè)媒體報(bào)道的新聞...
    72e35922b3c1閱讀 274評(píng)論 0 1