iOS UIButton與函數(shù)式編程

iOS當中函數(shù)式編程是通過Block來實現(xiàn)的歼争,前些天看到一段代碼,目的是改造UIButton來實現(xiàn)通過Block來定義button的響應事件,正好是實現(xiàn)函數(shù)式編程的一個方法堪置,現(xiàn)在過來分析一下。


首先张惹,iOS 官方提供的UIButton定義響應事件處理機制使用addTarget舀锨,如下所示:

[self.btn addTarget:self

action:@selector(btnAction)

forControlEvents:UIControlEventTouchUpInside];

首先定義了btnAction函數(shù),然后通過上述代碼來進行注冊宛逗。對于每一個按鈕坎匿,都需要定義一個函數(shù)來實現(xiàn)處理方法,當然不同的函數(shù)可以復用同一個方法雷激。但在應用當中替蔬,很多按鈕的處理功能是比較簡單的,使用函數(shù)來處理在代碼閱讀性上也不方便屎暇,你還需要在整個文件當中找到函數(shù)定義的位置承桥,使用Block首先就能解決這個問題。


再來看下如何使用Block來實現(xiàn)根悼。

首先需要對UIButton進行一個分類快毛,代碼如下:

typedefvoid(^btnBlock)(UIButton*btn);

@interfaceUIButton(buttonBlock)

- (void)addBlock:(btnBlock) block;

@end

static char propertyBlock;

@implementation UIButton(buttonBlock)

- (void)addBlock:(btnBlock)block

{

objc_setAssociatedObject(self

, &propertyBlock,

block,

OBJC_ASSOCIATION_COPY_NONATOMIC);

[self addTarget:self

action:@selector(btnAction)

forControlEvents:UIControlEventTouchUpInside];

}

- (void)btnAction

{

btnBlock block = objc_getAssociatedObject(self, &propertyBlock);

block(self);

}

@end

上述代碼在UIButton的基礎上增加了一個addBlock接口,其接入一個Block作為按鈕的響應處理方法番挺。上面代碼本質上其實也是調用了addTarget方法唠帝,只不過其內部對其進行了封裝。將傳入的Block保存成一個成員變量玄柏,然后使用addTarget注冊一個內部的處理方法襟衰,內部處理方法再調用Block。上述代碼當中使用了runtime機制:objc_setAssociatedObject粪摘,objc_getAssociatedObject瀑晒。看起來不知道是干嘛的徘意,其實使用runtime主要是解決一個問題:分類無法擴展原有類的成員變量苔悦,只能增加新的方法。你也可以在分類當中這樣定義

@property (nonatomic,strong) btnBlock actionBlock;

但是這樣并不能給分類增加成員椎咧,你只是定義了兩個新的方法:get與set玖详,你還需要實現(xiàn)get與set把介,如果你直接在代碼當中使用actionBlock = xxx,你將會得到錯誤蟋座。

objc_setAssociatedObject的作用是將兩個對象進行關聯(lián)拗踢,在使用當中可以通過該方法來動態(tài)在分類當中增加成員變量。上述代碼可以理解為先Block存放在一個成員變量當中向臀,然后在觸發(fā)時再從成員變量當中讀取Block運行巢墅。

最后在代理當中的調用如下所示:

[self.btnaddBlock:^(UIButton*btn) {

self.view.backgroundColor= [UIColorwhiteColor];

}];


然后再擴展一下iOS當中Block的一些?基本知識,首先Block當中的定義如下所示:

void(^localBlock)(NSString*name,NSIntegerage) = ^(NSString*name,NSIntegerage)

{

NSLog(@"%@ is %ld yeas old",name,age);

};

Block一個好處是可以引用Block定義處外部的變量券膀,也就是閉包君纫。但有一點要注意的是,如果外部是類似NSInteger變量芹彬,其在Block定義時庵芭,會對NSInteger做一個copy備份,其會作為一個const對象存放其中雀监,不能改變其值,也不會影響到Block外部的值眨唬。其實不完全是這樣会前,即使是一個NSString*類型的值,其在Block內部也是不可以修改的匾竿。應該這樣理解瓦宜,所以Block外部的變量在Block當中都不能修改,我們能夠修改的是變量指向的對象岭妖,因為在iOS當中變量都是指針临庇,我們在Block當中不能修改指針的指向,卻可以修改指向對象的內容昵慌。如果的確需要修改變量的值假夺,需要在外部變量定義處增加__block的修飾符。這樣在Block定義當中會傳入指針的引用斋攀,這樣就能夠修改其指向了已卷。另外如果要在Block當中引用self成員時,需要將self賦給一個指針淳蔼,使用__weak來進行修飾侧蘸,不然很容易造成交叉引用,使資源無法釋放鹉梨。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末讳癌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子存皂,更是在濱河造成了極大的恐慌晌坤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泡仗,居然都是意外死亡埋虹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門娩怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搔课,“玉大人,你說我怎么就攤上這事截亦∨滥啵” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵崩瓤,是天一觀的道長袍啡。 經(jīng)常有香客問我,道長却桶,這世上最難降的妖魔是什么境输? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮颖系,結果婚禮上嗅剖,老公的妹妹穿的比我還像新娘。我一直安慰自己嘁扼,他們只是感情好信粮,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趁啸,像睡著了一般强缘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上不傅,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天旅掂,我揣著相機與錄音,去河邊找鬼访娶。 笑死辞友,一個胖子當著我的面吹牛,可吹牛的內容都是我干的震肮。 我是一名探鬼主播称龙,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戳晌!你這毒婦竟也來了鲫尊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沦偎,失蹤者是張志新(化名)和其女友劉穎咳蔚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谈火,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年糯耍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囊嘉。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扭粱,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情琢蛤,我是刑警寧澤蜓堕,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布博其,位于F島的核電站,受9級特大地震影響贺奠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜错忱,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望以清。 院中可真熱鬧儿普,春花似錦、人聲如沸掷倔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勒葱。三九已至浪汪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凛虽,已是汗流浹背死遭。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凯旋,地道東北人呀潭。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓钉迷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钠署。 傳聞我的和親對象是個殘疾皇子糠聪,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容