詳解Objective-c閉包簡單應用
詳解Objective-c閉包簡單應用是本文要介紹的內容,主要介紹的是閉包的應用,不多說,文章中介紹的已經很詳細,我們先來看內容詳解。
概念介紹
這里的閉包自然是計算機語言中的閉包,詞法閉包(Lexical Closure)的簡稱,主要表現在函數可以引用到自由變量,并且可以脫離變量的創建環境,再復雜的定義也不需要多說明了,可以理解為面向對象里面的成員函數可以調用其成員變量,然其概念卻比面向對象的概念流行早的多,約六十年代在Scheme里就實現了。函數式編程語言里這是非常常見的概念,而非函數式的語言中js里也有很多閉包出現的身影。
Objective-c的閉包
準確地說在Objective-c里不叫閉包(Closure)而叫Block,但概念還是大同小異的。Mac平臺上需要LLVM的支持,總之較新的Xcode都是支持這個特性的。 自由變量在使用是需要用__block關鍵字定義,而閉包函數的形式與函數指針非常接近,簡單地說把函數指針的*換成^就可以了
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);
- }
是這么簡單。
閉包應用
單純就語法而言,閉包并沒什么好談的,但它的應用已經越來越廣,特別是iPhone新的GCD特性,廣泛使用了閉包,如果不知到閉包怎么寫,就會陷入明明系統提供了接口卻無法調用的尷尬境地。 可能會覺得,出了系統接口必須要用block而不得不使用的情況外,其他時候直接用函數指針不就得了,實際上除非你真的用到了自由變量,其他時候 block和函數指針確實沒什么區別,但block也有自己的獨到之處。
首先它不需要事先定義函數,如果是函數指針那么必須要把指針指向一個函數,而函數必須要定義,閉包則不然,直接對代碼塊就可以調用 其次就算已經事先定義好了函數,只要對函數名取一下^即可直接放到閉包的地方使用,可以理解為向下兼容吧。 比如iPhone的動畫效果,你必須先開始動畫,然后寫你想要動畫的操作,***提交,而開始動畫和提交之間的鴻溝沒法很好的協調,相當于這樣
Objective-c代碼
- [self beginAnimation];
- [self animationAction];
- [self endAnimation];
- [self beginAnimation];
- [self animationAction];
- [self endAnimation];
而且每個動畫都必需事先其專門的animationAction而iPhone的動畫效果實在是個很平常的操作,這就多出了無數冗余函數,即使它只是一行hidden之類,而且也不方便擴展,閉包就很適合這種需求
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];
- // 增加二次拔號鍵盤
- [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];
- // 增加二次拔號鍵盤
- [centerView_ addSubview:phonePad_ ];
- }
- ];
當然了,閉包最重要的概念還是自由變量什么的,可惜我一致沒法理解,這里僅僅是拿它當快捷的函數包裹來使用了。
小結:詳解Objective-c閉包簡單應用的內容介紹完了,希望本文對你有所幫助!