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就指向了一個已經被銷毀的對象(此時出現野指針現象),如果再對其發送消息會引發崩潰。