1、替換delegate 如果我們有2個viewController,a和b,當我們從a介面push到b後,在b上面觸發了一些事件,這些時間又會影響到a介面上的內容。 上面是2個介面,當我們點擊b介面的按鈕3的時候,希望a介面上文字也相應的改變了如 一般情況下我們會用delegate來實現。代理很強大,不過代理它是程式的事件邏輯也變的複雜了。 來看下用block怎麼處理。 一個block語句的定義類似於C的函數,有傳回值,有0到多個參數,接下來屬性聲明,跟一般的屬性聲明差不多:
typedef (^CallBack)( @property(nonatomic, copy)CallBack callBack;
然後在b裡面觸發按鈕事件的時候調用block,調用前最好先檢查下是否為nil
1 - (IBAction)click2:(id)sender 2 { 3 if(self.callBack) 4 self.callBack(2); 5 } 6 7 8 - (IBAction)click3:(id)sender 9 {10 if(self.callBack)11 self.callBack(3);12 }
現在完成了調用,具體的實現在哪呢,我們回到a當中,在a中執行跳轉介面的地方,加上相關的實現。
SecondViewController *secondController = [[SecondViewController alloc]initWithNibName: secondController.callBack = ^( self.clickBtnLabel.text = [NSString stringWithFormat: [self.navigationController pushViewController:secondController animated:YES];
在是用block的時候,要注意所有權的問題,要小心產生迴圈,那樣會導致資源無法釋放。例如在block中使用了一個指標,恰巧這個指標又是block的擁有者,那麼會產生一個循環參考,他們都是強引用,無法釋放。為了避免產生類似的問題,就需要用__weak標記block的擁有者。delegate和block在上面時候是用,要看具體情況,如果一個類的delegate裡有很多方法,那還是放在delegate裡實現吧。 2、系統定義的blockios當中還有大量系統已經定義好的block,使用這些block實現特定的一些功能,能是整體代碼更加簡潔和高效。例如遍曆字典的時候,ios就提供了:
- ()enumerateKeysAndObjectsUsingBlock:( (^)( key, obj, BOOL *stop))block;
簡單舉個例子,我們要在字典中根據key來尋找某個value,然後把value記錄下來。
NSArray *keyArray = @[, , , , , NSArray *valueArray = @[, , , , , NSDictionary *enumDict = __block NSString *valueString = [enumDict enumerateKeysAndObjectsUsingBlock:^( key, obj, BOOL * ([key isEqualToString: valueString = *stop = }];
整個過程變的簡單了。
還有在實現UIView動畫的時候,block能讓我們更加簡單高效的實現很多特效。
[UIView animateWithDuration: animations:^ animateView.alpha = } completion:^ animateView.alpha = }];
這段代碼實現了view透明度從1.0變到完全透明,用時0.5秒,當動畫結束後重新顯示view。