<一> 代理模式基本使用 (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);
}
<二> 代理原理
屏幕快照 2018-01-16 下午4.03.04.png在iOS中代理的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是用一个id类型的指针将代理对象进行了一个弱引用。委托方让代理方执行操作,实际上是在委托类中向这个id类型指针指向的对象发送消息,而这个id类型指针指向的对象,就是代理对象。
为什么使用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
网友评论