使用@selector模仿代理功能降低代码耦合度
说明
该模式的好处就是两个产生联系的对象间并没有具体的耦合代码,增删改查均很直观
源码
Model
//
// Model.h
// SELMethod
//
// Created by YouXianMing on 15/5/22.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import <Foundation/Foundation.h>
#define SafePerformSelector(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
@interface Model : NSObject
/**
* 属性名字
*/
@property (nonatomic, strong) NSString *name;
/**
* 设置代理与方法
*/
@property (nonatomic, weak) id delegate;
@property (nonatomic) SEL method;
- (void)doSomeThing;
@end
//
// Model.m
// SELMethod
//
// Created by YouXianMing on 15/5/22.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import "Model.h"
@implementation Model
- (void)doSomeThing {
// 执行代理以及方法
if (_method && _delegate) {
SafePerformSelector([_delegate performSelector:_method withObject:self]);
}
}
@end
ViewController
//
// ViewController.m
// SELMethod
//
// Created by YouXianMing on 15/5/22.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import "ViewController.h"
#import "Model.h"
@interface ViewController ()
@property (nonatomic, strong) Model *model;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化对象
self.model = [Model new];
self.model.name = @"YouXianMing";
// 设置代理与方法
self.model.method = @selector(modelValue:);
self.model.delegate = self;
// 执行操作
[self.model doSomeThing];
}
- (void)modelValue:(Model *)value {
NSLog(@"%@", value.name);
}
@end
细节