1.创建代理协议
2.在要传值的类中创建一个该代理的属性
//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
- 在需要接收值和实现该协议的类中遵从代理协议
#import "ViewController.h"
#import "SecondViewController.h"
//3-1 遵从代理协议
@interface ViewController ()<Delegate>
@end
@implementation ViewController
- (void)present{
SecondViewController *secondVC = [[SecondViewController alloc] init];
secondVC.delegate = self; //3-2 设置当前对象为该代理
[self presentViewController:secondVC animated:YES completion:nil];
}
//3-3 使用传入的值 实现代理协议方法
- (void)number1:(NSInteger)number1 AddNumber2:(NSInteger)number2
{
NSLog(@"The result = %ld",number1 + number2);
}
- 设置并调用代理协议方法
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
//4 调用代理方法
[self.delegate number1:2 AddNumber2:5];
}
需要注意的是代理的修饰词:
若用strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用。
若用assing:采用assign修饰代理时,是指针赋值,没有引用计数操作,当页面销毁时这个对应的代理地址并没置为nil,从而导致成为了一个野指针,然后在调用方法时便会产生崩溃;而weak不会产生野指针。
若用weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。