1.創(chuàng)建代理協(xié)議
2.在要傳值的類中創(chuàng)建一個(gè)該代理的屬性
//1
#import <Foundation/Foundation.h>
@protocol Delegate<NSObject>
- (void)number1:(NSInteger)number1 AddNumber2:(NSInteger)number2;
@end
//2
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
@property (nonatomic,weak) id<Delegate> delegate;
@end
- 在需要接收值和實(shí)現(xiàn)該協(xié)議的類中遵從代理協(xié)議
#import "ViewController.h"
#import "SecondViewController.h"
//3-1 遵從代理協(xié)議
@interface ViewController ()<Delegate>
@end
@implementation ViewController
- (void)present{
SecondViewController *secondVC = [[SecondViewController alloc] init];
secondVC.delegate = self; //3-2 設(shè)置當(dāng)前對(duì)象為該代理
[self presentViewController:secondVC animated:YES completion:nil];
}
//3-3 使用傳入的值 實(shí)現(xiàn)代理協(xié)議方法
- (void)number1:(NSInteger)number1 AddNumber2:(NSInteger)number2
{
NSLog(@"The result = %ld",number1 + number2);
}
- 設(shè)置并調(diào)用代理協(xié)議方法
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
//4 調(diào)用代理方法
[self.delegate number1:2 AddNumber2:5];
}
需要注意的是代理的修飾詞:
若用strong:該對(duì)象強(qiáng)引用delegate,外界不能銷毀delegate對(duì)象,會(huì)導(dǎo)致循環(huán)引用。
若用assing:采用assign修飾代理時(shí),是指針賦值,沒有引用計(jì)數(shù)操作,當(dāng)頁(yè)面銷毀時(shí)這個(gè)對(duì)應(yīng)的代理地址并沒置為nil,從而導(dǎo)致成為了一個(gè)野指針,然后在調(diào)用方法時(shí)便會(huì)產(chǎn)生崩潰;而weak不會(huì)產(chǎn)生野指針。
若用weak:指明該對(duì)象并不負(fù)責(zé)保持delegate這個(gè)對(duì)象,delegate這個(gè)對(duì)象的銷毀由外部控制。