代理模式(OC与Swift)

<一> 代理模式基本使用 (OC版)

代理模式(OC与Swift)_第1张图片
屏幕快照 2018-01-16 下午2.17.48.png

个人理解: 代理就是自己不想做的事情,让代理做。(类似老板和秘书)

委托方

在.h中 (老板招聘秘书条件: 漂亮,能干)

// 代理 第一步 制定协议
@protocol ChildViewControllerDelegate 

@required // 必须实现
-(void)controller:(UIViewController *)controller doSomeThing:(NSString *)thing;
@optional // 可选实现
- (void)controller:(UIViewController *)controller sayHello:(NSString *)thing;

@end

@interface ChildViewController : UIViewController

// 代理第二步 : 设置代理属性
@property (nonatomic,weak) id delegate;

@end

在.m中 ,(通知秘书该干活了)

- (void)action:(UIButton *)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(controller:doSomeThing:)]) {
        [self.delegate controller:self doSomeThing:@"你想做啥就做啥"];
        [self.delegate controller:self sayHello:@"hello"];
    }
}

代理方

指定代理 (老板选定秘书了)

- (IBAction)delegateAction:(UIButton *)sender {
    ChildViewController * vc = [[ChildViewController alloc]init];
    vc.delegate = self;
    [self.navigationController pushViewController:vc animated:YES];
}

执行代理方法 (秘书要做的事);

- (void)controller:(UIViewController *)controller doSomeThing:(NSString *)thing
{
    NSLog(@"%@----%@",controller,thing);
}
- (void)controller:(UIViewController *)controller sayHello:(NSString *)thing
{
    NSLog(@"%@",thing);
}

<二> 代理原理

在iOS中代理的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是用一个id类型的指针将代理对象进行了一个弱引用。委托方让代理方执行操作,实际上是在委托类中向这个id类型指针指向的对象发送消息,而这个id类型指针指向的对象,就是代理对象。

代理模式(OC与Swift)_第2张图片
屏幕快照 2018-01-16 下午4.03.04.png

为什么使用weak

1.我们定义的指针默认都是__strong类型的,而属性本质上也是一个成员变量和set、get方法构成的,strong类型的指针会造成强引用,必定会影响一个对象的生命周期,这也就会形成循环引用。

2,weak和assign是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。在iOS中,向nil发送消息时不会导致崩溃的,所以assign就会导致野指针的错误unrecognized selector sent to instance。

<三> Swift 代理使用

委托方

// 声明协议
protocol PGRegisterViewDelegate: class {

    func clickVerificationCodeButton()
    func clickRegisterButton()
}
// 设置代理属性
class PGRegisterView: UIView {
    weak var delegate: PGRegisterViewDelegate?
}
// 点击事件触发 代理执行协议
   @objc func getVerificationCodeAction() {
        delegate?.clickVerificationCodeButton()
    }
    @objc func registerAction (){
        delegate?.clickRegisterButton()
    }

代理方

// 遵守协议
class PGRegisterViewController: PGBaseViewController,PGRegisterViewDelegate {
    var registerView: PGRegisterView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
// 设置代理
        registerView = PGRegisterView(frame: CGRect(x: 0, y: Navigation_Height(), width: K_Screen_With(), height: K_Screen_Height() - Navigation_Height()))
        registerView?.delegate = self
        view.addSubview(registerView!)
    }
// 实现代理方法
    func clickVerificationCodeButton() {
        print("点击了获取验证码")
    }
    func clickRegisterButton() {
        print("点击了注册")
    }
}
代理模式(OC与Swift)_第3张图片
屏幕快照 2018-01-19 下午3.39.51.png

你可能感兴趣的:(代理模式(OC与Swift))