Delegate筐钟、Block揩瞪、Notification

對比
  • Delegate(委托/代理)
    優(yōu)點:
    1.同一個協(xié)議,一個對象只能同時設置一個代理篓冲,單例一般不用代理李破;
    2.相對側(cè)重于過程;
    3.降低代碼的耦合性壹将,事件監(jiān)聽和處理相對分離嗤攻。
    缺點:
    1.實現(xiàn)過程繁瑣;
    2.跨層傳值監(jiān)聽不方便诽俯;
    3.難以對多個對象同時傳值妇菱。

  • Block(塊)
    優(yōu)點:
    1.書寫簡練;
    2.側(cè)重結果;
    3.配合GCD解決多線程問題闯团。
    缺點:
    1.需要防止循環(huán)引用辛臊;
    2.delegate運行成本低,block成本很高的。
    block出棧需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存偷俭,當然對象的話就是加計數(shù)浪讳,使用完或者block置nil后才消除;delegate只是保存了一個對象指針涌萤,直接回調(diào)淹遵,沒有額外消耗。相對C的函數(shù)指針负溪,只多做了一個查表動作

  • Notification(通知)
    優(yōu)點:
    1.一對多透揣,解決了多對象監(jiān)聽問題;
    2.傳值方便快捷川抡,Context自身攜帶相應的內(nèi)容辐真。
    缺點:
    1..使用完要記得注銷通知,防止crash崖堤;
    2.調(diào)試的時候動作的跟蹤將很難進行侍咱;
    3.需要一個第三方的對象來做監(jiān)聽者與被監(jiān)聽者的中介。

Delegate
//協(xié)議文件中,值提供方法的聲明,不提供具體的實現(xiàn)內(nèi)容
//誰遵循了該協(xié)議,誰來實現(xiàn)協(xié)議中聲明的方法
//協(xié)議本身可以遵循其他協(xié)議
//默認情況下所有的協(xié)議,都遵循了NSObject基礎協(xié)議

@class NAEvaluateCell;
@protocol NAEvaluateCellDelegate <NSObject>
// 可選實現(xiàn)標記
@optional
- (void)addPictures;
// 必選實現(xiàn)標記密幔,語法級別警告,并不會導致程序編譯錯誤
@required
- (void)evaluateCell:(NAEvaluateCell *)cell deleteIndex:(NSInteger)index;

@end

一些注意點:

1 做判斷
if (self.delegate && [self.delegate respondsToSelector:@selector(evaluateCell:deleteIndex:)]) {
                [self.delegate evaluateCell:weakSelf deleteIndex:index];
            }

2 遵循協(xié)議<NAEvaluateCellDelegate>
3 實現(xiàn)方法
Block
typedef void (^deleteData)(int index);

@interface NAEvaluateItemCell : UICollectionViewCell
/** 宏定義方式 */
@property (nonatomic, copy) deleteData deleteDataIndex;
/** 直接書寫 */
@property (nonatomic, copy) void (^clickBlock)(void);  // 無參數(shù)無返回值

@end

// 使用
self.clickBlock();
[cell setClickBlock:^{  }];

if (self.deleteDataIndex) {
 self.deleteDataIndex((int)self.indexPath.row);
}
cell.deleteDataIndex = ^(int index) {
};
  • Block模式
    1.無參數(shù)無返回值
void (^emptyBlock)() = ^(){
        NSLog(@"無參數(shù)無返回值");
 };
 emptyBlock();

2.有參數(shù)無返回值

void (^sumBlock)(int, int) = ^(int a, int b){
        NSLog(@"有參數(shù)無返回值");
    };
sumBlock(10,10);

3.有參數(shù)有返回值

NSString* (^logBlock)(NSString *, NSString *) = ^(NSString *str1, NSString *str2){
        return [NSString stringWithFormat:@"%@%@",str1,str2];
    };
NSLog(@"%@", logBlock(@"有參數(shù)有返回值的", @"Block"));
  • 循環(huán)引用解決方案

ARC
如果用copy修飾Block,該Block就會存儲在堆空間楔脯。則會對Block的內(nèi)部對象進行強引用,導致循環(huán)引用,內(nèi)存無法釋放
__weak typeof (target)weakTarget = target;
如果用weak修飾Block,該Block就會存放在椏杷Γ空間昧廷。不會出現(xiàn)循環(huán)引用問題

MRC
用copy修飾后要在Block內(nèi)部使用對象,則需要__block typeof (target)blockTarget = target;

  • 使用場合偎箫。

任務完成時回調(diào)處理
消息監(jiān)聽回調(diào)處理
錯誤回調(diào)處理
枚舉回調(diào)
視圖動畫木柬、變換
排序

  • 主線程中UI操作

dispatch_async(dispatch_get_main_queue(), <^(void)block>)

Notification
- (void)addNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification object:nil];
    
}

- (void)keyboardWillShow:(NSNotification *)notification
{
    NSDictionary* info = [notification userInfo];
    CGFloat height = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    [UIView animateWithDuration:0.2 animations:^{
    } completion:^(BOOL finished) {
    }];
}

- (void)keyboardWillHide:(NSNotification *)notification {
}
#pragma mark 銷毀時移除
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

根據(jù)isa指針,block一共有3種類型的block
_NSConcreteGlobalBlock 全局靜態(tài)
_NSConcreteStackBlock 保存在棧中淹办,出函數(shù)作用域就銷毀
_NSConcreteMallocBlock 保存在堆中眉枕,retainCount == 0銷毀

重要經(jīng)驗五:block作為屬性的注意事項
iOS中Block的基礎用法
知乎上block問題回答
Block,Delegate,Notification
淺談 iOS Notification
iOS Block底層實現(xiàn)原理詳解
Block全面分析
單例傳值、block傳值怜森、代理傳值與通知中心傳值

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齐遵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子塔插,更是在濱河造成了極大的恐慌,老刑警劉巖拓哟,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件想许,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機流纹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門糜烹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漱凝,你說我怎么就攤上這事疮蹦。” “怎么了茸炒?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵愕乎,是天一觀的道長。 經(jīng)常有香客問我壁公,道長感论,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任紊册,我火速辦了婚禮比肄,結果婚禮上,老公的妹妹穿的比我還像新娘囊陡。我一直安慰自己芳绩,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布撞反。 她就那樣靜靜地躺著妥色,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痢畜。 梳的紋絲不亂的頭發(fā)上垛膝,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音丁稀,去河邊找鬼吼拥。 笑死,一個胖子當著我的面吹牛线衫,可吹牛的內(nèi)容都是我干的凿可。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼授账,長吁一口氣:“原來是場噩夢啊……” “哼枯跑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起白热,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤敛助,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屋确,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纳击,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡续扔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了焕数。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纱昧。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堡赔,靈堂內(nèi)的尸體忽然破棺而出识脆,到底是詐尸還是另有隱情,我是刑警寧澤善已,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布灼捂,位于F島的核電站,受9級特大地震影響雕拼,放射性物質(zhì)發(fā)生泄漏纵东。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一啥寇、第九天 我趴在偏房一處隱蔽的房頂上張望偎球。 院中可真熱鬧,春花似錦辑甜、人聲如沸衰絮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猫牡。三九已至,卻和暖如春邓线,著一層夾襖步出監(jiān)牢的瞬間淌友,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工骇陈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留震庭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓你雌,卻偏偏與公主長得像器联,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子婿崭,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 簡介 網(wǎng)上對于delegate,block,notification運用都有介紹拨拓,但都是介紹的用法;我這里針對于懶...
    SimonLike閱讀 652評論 0 0
  • delegate是經(jīng)典設計模式也就是大部分的語言都可以實現(xiàn)的模式氓栈,delegate只是保存了一個對象指針渣磷,直接回調(diào)...
    A訫飛Flyme閱讀 169評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,130評論 30 470
  • 設計模式 1.delegate和notification什么區(qū)別,什么情況使用? 2.描述一下KVO和KVC授瘦。 K...
    丶逐漸閱讀 1,953評論 3 2
  • 記憶是個奇特的東西醋界,在時間的滴答聲中漸漸遠去的事情祟身,在某天某一時刻某個地方,看見或者遇到某件事物物独,會突然地浮現(xiàn)出來...
    春天的麥琪閱讀 207評論 1 5