iOS中delegate

delegate

delegate就是代理的含義, 一件事情自己不方便做,然后交給其他人去幫助實現, 比如A、B兩個類,A的一個對象有一個任務aTask要在B類中實現,任務無法在A類本身中實現,所以要交給B類幫忙,則A和B約定一個協議:

我們先來用下delegate進行界面中的傳值

首先創建兩個控制器分別是ViewController和SubViewController。
現在從后者中把值傳到前者.步驟如下:

  • 一:在SubViewController.h中創建協議和聲明代理屬性
    #import <UIKit/UIKit.h>

    //1:創建協議
    @protocol sendValueDelegate <NSObject>
    
    //協議的方法(遵循代理之后執行的方法)
    -(void)sendValue:(NSString *)text;
    @end
    
    @interface SubViewController : UIViewController
    
    //2:設置代理屬性(用weak修飾)
    @property(nonatomic,weak)id<sendValueDelegate>delegate;
    
    @end
    
  • 二:在SubViewController.m中實現代理傳值(沒有做觸發事件,在控制器即將消失是激發傳值時間)
    -(void)viewWillDisappear:(BOOL)animated{

        [super viewWillDisappear:animated];
    
        if (self.delegate && [self.delegate respondsToSelector:@selector(sendValue:)]) {
      
      [self.delegate sendValue:@"利用代理傳值"];
      
        }
    }
    
  • 三:在ViewController.m中包含SubViewController.h頭文件并遵行SubViewController的代理并設置代理(UIButton點擊事件觸發)

    #import "ViewController.h"
    #import "SubViewController.h"
    @interface ViewController ()<sendValueDelegate>
    @end
    
    
    -(void)btnClick:(UIButton *)sender{
    
        SubViewController *sub = [[SubViewController alloc]init];
    
        sub.delegate = self;
    
        [self.navigationController pushViewController:sub animated:YES];
    
    }
    
  • 四:實現代理的方法
    //實現代理方法
    -(void)sendValue:(NSString *)text{

        _delegateLabel.text = text;
    
    }
    

這時從SubViewController控制器跳轉回UIViewController控制器中可以看到 _delegateLabel的值變為“利用代理傳值”。

接下來講下delegate的一些注意點

  • 1:創建協議時 協議方法可以有多個。但是委托的方法不是百分百必須實現的.必須實現的方法用required修飾的方法是必須實現的.協議默認聲明在其中的方法為必須實現的方法.@optional修飾的方法是可選實現的。

  • 2:申明協議要用weak修飾
    原因就是因為在程序運行時會有循環引用現象,如果用strong修飾的話會造成引用計數器增加,導致對象不會被銷毀,不會調用delloc方法,造成了內存泄漏,使用weak修飾則避免了循環引用,很好的避免內存泄漏.當然在補充一點如果是在MRC中還會用assign修飾。weak屬性的變量是不為其所屬對象持有的,并且在該變量被銷毀之后,此weak變量的值會自動被賦值為nil。而assign屬性一般是對C基本數據類型成員變量的聲明,當然也可以用在對象類型成員變量上,只是其代表的意義只是單純地拷貝所賦值變量的值。即如果對某assign成員變量B賦值某對象A的指針,則此B只是簡單地保存此指針的值,且并不持有對象A,也就意味著如果A被銷毀,則B就指向了一個已經被銷毀的對象(此時出現野指針現象),如果再對其發送消息會引發崩潰。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,205評論 30 471
  • __block和__weak修飾符的區別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,358評論 0 6
  • 在開發IOS應用的時候,我們會經常遇到一個常見的問題:在不過分耦合的前提下,controllers[B]怎么進行通...
    貝勒老爺閱讀 470評論 0 6
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,002評論 0 7
  • 嗚咽河緩緩流淌著。猶如一道撕裂的疤痕,靜臥這片土地上。西下的陽光打在河面上,泛出斑駁金光。岸邊的荒草叢生,死一般寂...
    邵曉寧閱讀 893評論 7 5