iOS中代理的使用

2018-04-12  本文已影响0人  敌敌味丶

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
  1. 在需要接收值和实现该协议的类中遵从代理协议
#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);
}
  1. 设置并调用代理协议方法
#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这个对象的销毁由外部控制。

上一篇 下一篇

猜你喜欢

热点阅读