您好,登錄后才能下訂單哦!
這篇文章主要介紹了block怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
block語法
1.代理協(xié)議和通知的區(qū)別 :兩者的對象直接的耦合性不同.通知的代碼的可讀性太差. 代理,通知,block三種通信都實(shí)現(xiàn)了對象之間的解耦合. 通知的通信方式是1對多;代理,block是1對1
2.block(閉包):與函數(shù)相似,是一個(gè)匿名的函數(shù)代碼快,此代碼可以作為參數(shù)傳遞給其他對象
3. /*
局部的基本數(shù)據(jù)類型變量,進(jìn)入到block中,num會(huì)變成常量。如果需要在block中對num進(jìn)行修改,需要加上關(guān)鍵字__block (我們也可以用static關(guān)鍵字進(jìn)行修飾,也可以設(shè)置成全局變量)
*/
__blockint num = 10;
MyBlock block1 = ^{
NSLog(@"num is %d", num);
//當(dāng)沒有加上__block時(shí),錯(cuò)誤,不能對常量進(jìn)行自加操作
num++;
}
num = 20;
block1();
NSLog(@"num is %d", num);
/*
局部的OC對象進(jìn)入到block時(shí), 該對象會(huì)被retain一次,如果用__block修飾則不會(huì)(注意: block在堆區(qū)上時(shí)才會(huì)起到retain作用,所以下面要對block進(jìn)行一次copy操作,將block從棧區(qū)copy到堆區(qū)上)
*/
__blockNSObject *obj = [[NSObjectalloc] init];
NSLog(@"%ld", obj.retainCount);
MyBlock block2 = ^{
NSLog(@"%ld", obj.retainCount);
};
[block2 copy];//將block copy到堆區(qū)上一份,就不會(huì)再受棧區(qū)的影響(那么會(huì)將這個(gè)Block copy到堆上分配,這樣就不再受棧的限制,可以隨意使用啦)
block2();
__blockPerson *ps = [[Personalloc] init];
MyBlock block3 = ^{
NSLog(@"%ld", ps.retainCount);
};
[block3 copy];
block3();
[ps release];
[block3 release];
4.Block的內(nèi)存管理
在block里面引用一個(gè)實(shí)例變量(成員變量)時(shí),該變量所在的對象會(huì)被retain一次
// self -> btn -> block -> self造成循環(huán)引用,斷掉block->self
// __blockSecondViewController *secondVC = self;創(chuàng)建secondVC作為self的中間變量(在SecondViewController類的內(nèi)部 ,且在MRC情況下)
//在ARC中,__block關(guān)鍵字不能解決循環(huán)引用的問題,因?yàn)榧词故褂昧薩_block關(guān)鍵字,它仍舊是一個(gè)strong類型的對象,進(jìn)入到block塊時(shí),仍舊會(huì)被block持有,這個(gè)時(shí)候__block關(guān)鍵字起的作用僅僅只是表示該指針變量進(jìn)入到block塊是是一個(gè)可修改的變量.所以使用__weak,使類與對象之間產(chǎn)生弱引用關(guān)系
__weakSecondViewController *weakSelf = self;
BaseButton *btn = [[BaseButtonalloc] initWithFrame:CGRectMake(200, 200, 100, 100) WithBlock:^(UIButton *btn) {
//通常情況下,在block塊中,我們再將__weak對象轉(zhuǎn)換成一個(gè)strong對象,為了更方便拿到自身的成員變量
__strongSecondViewController *strongSelf = weakSelf;
[strongSelf.navigationControllerpopViewControllerAnimated:YES];
5.自定義類BlockAlertView.m文件中
復(fù)寫父類多參數(shù)的方法,需要引入C語言的庫函數(shù)#import <stdarg.h>
- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegatecancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
{
self = [superinitWithTitle:title message:message delegate:selfcancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles,nil];
//獲取多參數(shù)中otherButtonTitles后面的多參數(shù)
//定義一個(gè)指針函數(shù)
va_list p;
id test;//列表中的指針?biāo)赶虻南乱粋€(gè)參數(shù)
if (otherButtonTitles) {//如果otherButtonTitles存在,則遍歷列表,如果不存在,則就不是多參數(shù),無需遍歷
va_start(p, otherButtonTitles);
while ((test = va_arg(p, id))) {//如果取到列表中的參數(shù)
[selfaddButtonWithTitle:test];//就給將參數(shù)添加到AlertView上,并給title賦值
}
va_end(p);
}
returnself;
}
在控制器RootViewController.m文件中,調(diào)用BlockAlertView的復(fù)寫父類的初始化多參數(shù)方法
BlockAlertView *alert =[[BlockAlertViewalloc]initWithTitle:@"歡迎"message:@"HelloWorld"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"確定", @"退出",@"不再提示",@"再次提醒",nil];
alert.block = ^(NSInteger index){
NSLog(@"index----%ld",index);
};
[alert show];
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“block怎么用”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。