詳解Objective-c閉包簡(jiǎn)單應(yīng)用
詳解Objective-c閉包簡(jiǎn)單應(yīng)用是本文要介紹的內(nèi)容,主要介紹的是閉包的應(yīng)用,不多說(shuō),文章中介紹的已經(jīng)很詳細(xì),我們先來(lái)看內(nèi)容詳解。
概念介紹
這里的閉包自然是計(jì)算機(jī)語(yǔ)言中的閉包,詞法閉包(Lexical Closure)的簡(jiǎn)稱(chēng),主要表現(xiàn)在函數(shù)可以引用到自由變量,并且可以脫離變量的創(chuàng)建環(huán)境,再?gòu)?fù)雜的定義也不需要多說(shuō)明了,可以理解為面向?qū)ο罄锩娴某蓡T函數(shù)可以調(diào)用其成員變量,然其概念卻比面向?qū)ο蟮母拍盍餍性绲亩?,約六十年代在Scheme里就實(shí)現(xiàn)了。函數(shù)式編程語(yǔ)言里這是非常常見(jiàn)的概念,而非函數(shù)式的語(yǔ)言中js里也有很多閉包出現(xiàn)的身影。
Objective-c的閉包
準(zhǔn)確地說(shuō)在Objective-c里不叫閉包(Closure)而叫Block,但概念還是大同小異的。Mac平臺(tái)上需要LLVM的支持,總之較新的Xcode都是支持這個(gè)特性的。 自由變量在使用是需要用__block關(guān)鍵字定義,而閉包函數(shù)的形式與函數(shù)指針?lè)浅=咏?jiǎn)單地說(shuō)把函數(shù)指針的*換成^就可以了
Objective代碼
- typedef int (^IntBlock)();
- IntBlock downCounter(int start)
- {
- __block int i = start;
- return Block_copy( ^int(){return i--; }); }
- IntBlock f = downCounter(5);
- printf("%d", f());
- printf("%d", f());
- printf("%d", f());
- Block_release(f);
- }
- typedef int (^IntBlock)();
- IntBlock downCounter(int start)
- {
- __block int i = start;
- return Block_copy( ^int(){return i--; }); }
- IntBlock f = downCounter(5);
- printf("%d", f());
- printf("%d", f());
- printf("%d", f());
- Block_release(f);
- }
是這么簡(jiǎn)單。
閉包應(yīng)用
單純就語(yǔ)法而言,閉包并沒(méi)什么好談的,但它的應(yīng)用已經(jīng)越來(lái)越廣,特別是iPhone新的GCD特性,廣泛使用了閉包,如果不知到閉包怎么寫(xiě),就會(huì)陷入明明系統(tǒng)提供了接口卻無(wú)法調(diào)用的尷尬境地。 可能會(huì)覺(jué)得,出了系統(tǒng)接口必須要用block而不得不使用的情況外,其他時(shí)候直接用函數(shù)指針不就得了,實(shí)際上除非你真的用到了自由變量,其他時(shí)候 block和函數(shù)指針確實(shí)沒(méi)什么區(qū)別,但block也有自己的獨(dú)到之處。
首先它不需要事先定義函數(shù),如果是函數(shù)指針那么必須要把指針指向一個(gè)函數(shù),而函數(shù)必須要定義,閉包則不然,直接對(duì)代碼塊就可以調(diào)用 其次就算已經(jīng)事先定義好了函數(shù),只要對(duì)函數(shù)名取一下^即可直接放到閉包的地方使用,可以理解為向下兼容吧。 比如iPhone的動(dòng)畫(huà)效果,你必須先開(kāi)始動(dòng)畫(huà),然后寫(xiě)你想要?jiǎng)赢?huà)的操作,***提交,而開(kāi)始動(dòng)畫(huà)和提交之間的鴻溝沒(méi)法很好的協(xié)調(diào),相當(dāng)于這樣
Objective-c代碼
- [self beginAnimation];
- [self animationAction];
- [self endAnimation];
- [self beginAnimation];
- [self animationAction];
- [self endAnimation];
而且每個(gè)動(dòng)畫(huà)都必需事先其專(zhuān)門(mén)的animationAction而iPhone的動(dòng)畫(huà)效果實(shí)在是個(gè)很平常的操作,這就多出了無(wú)數(shù)冗余函數(shù),即使它只是一行hidden之類(lèi),而且也不方便擴(kuò)展,閉包就很適合這種需求
Objective-c代碼
- + (void)animation:(NSTimeInterval)duration withEvent:(animationEvent)event
- {
- [UIView beginAnimations:@"animationID" context:nil];
- [UIView setAnimationDuration:duration];
- [UIView setAnimationCurve:UIViewAnimationCurveLinear];
- [UIView setAnimationRepeatAutoreverses:NO];
- event();
- [UIView commitAnimations];
- }
- [Tools animation:0.8 withAnimationCurve:UIViewAnimationCurveEaseInOut withEvent:^{[
- UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:centerView_ cache:YES];
- // 移除功能列表
- [menuView_ removeFromSuperview];
- // 增加二次拔號(hào)鍵盤(pán)
- [centerView_ addSubview:phonePad_ ];
- }
- ];
- + (void)animation:(NSTimeInterval)duration withEvent:(animationEvent)event
- {
- [UIView beginAnimations:@"animationID" context:nil];
- [UIView setAnimationDuration:duration];
- [UIView setAnimationCurve:UIViewAnimationCurveLinear];
- [UIView setAnimationRepeatAutoreverses:NO];
- event();
- [UIView commitAnimations];
- }
- [Tools animation:0.8 withAnimationCurve:UIViewAnimationCurveEaseInOut withEvent:^{[
- UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:centerView_ cache:YES];
- // 移除功能列表
- [menuView_ removeFromSuperview];
- // 增加二次拔號(hào)鍵盤(pán)
- [centerView_ addSubview:phonePad_ ];
- }
- ];
當(dāng)然了,閉包最重要的概念還是自由變量什么的,可惜我一致沒(méi)法理解,這里僅僅是拿它當(dāng)快捷的函數(shù)包裹來(lái)使用了。
小結(jié):詳解Objective-c閉包簡(jiǎn)單應(yīng)用的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!