IOS代理模式(OC与Swift)

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

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

委托方

在.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("点击了注册")
}
}
特别声明:文章多为网络转载,资源使用一般不提供任何帮助,特殊资源除外,如有侵权请联系!
技术狗 » IOS代理模式(OC与Swift)