美文网首页iOS程序员
代理模式(OC与Swift)

代理模式(OC与Swift)

作者: 逾期的誓言 | 来源:发表于2018-01-16 16:07 被阅读18次

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

    屏幕快照 2018-01-16 下午2.17.48.png

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

    委托方

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

    // 代理 第一步 制定协议
    @protocol ChildViewControllerDelegate <NSObject>
    
    @required // 必须实现
    -(void)controller:(UIViewController *)controller doSomeThing:(NSString *)thing;
    @optional // 可选实现
    - (void)controller:(UIViewController *)controller sayHello:(NSString *)thing;
    
    @end
    
    @interface ChildViewController : UIViewController
    
    // 代理第二步 : 设置代理属性
    @property (nonatomic,weak) id <ChildViewControllerDelegate>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类型指针指向的对象,就是代理对象。

    屏幕快照 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("点击了注册")
        }
    }
    
    屏幕快照 2018-01-19 下午3.39.51.png

    相关文章

      网友评论

      本文标题:代理模式(OC与Swift)

      本文链接:https://www.haomeiwen.com/subject/jugsoxtx.html