一个应用 ,一般都会有很多对象,对象与对象之间避免不了进行消息传递。说到消息传递,肯定是相互的,即由A传到B,也可以由B传的A。 iOS下,有以下消息传递方式:
这篇文章主要介绍Target-Action,其他方法这里暂不介绍。 先来看以下Target-Action在系统提供的Framework中都有哪些使用。
方案1:#import <Foundation/Foundation.h> // @interface Manager : NSObject // -(void)addTarget:(id)aTarget selector:(SEL)aSelector; @end
#import "Manager.h"
//
@interface Manager ()
//
@property (nonatomic, weak) id target;
@property (nonatomic, assign) SEL selector;
@end
//
@implementation Manager
//
-(id)init {
self = [super init];
if (self) {
//
}
return self;
}
//
(void)addTarget:(id)aTarget selector:(SEL)aSelector {
_target = aTarget;
_selector = aSelector;
}
@end
方案2#import <Foundation/Foundation.h> // @interface Manager : NSObject // -(void)addTarget:(id)aTarget selector:(SEL)aSelector forEvent:(NSInteger)aEvent; -(void)removeTarget:(id)aTarget forEvent:(NSInteger)aEvent; @end
#import "Manager.h"
//
@interface Manager ()
//
@property (nonatomic, strong) NSMutableDictionary *targetDict;
@end
//
@implementation Manager
//
-(id)init {
self = [super init];
if (self) {
_targetDict = [[NSMutableDictionary alloc] initWithCapacity:0];
}
return self;
}
//
-(void)addTarget:(id)aTarget selector:(SEL)aSelector forEvent:(NSInteger)aEvent {
NSString *key = [NSString stringWithFormat:@"%zd",aEvent];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:0];
[dict setValue:aTarget forKey:@"target"];
[dict setValue:NSStringFromSelector(aSelector) forKey:@"action"];
[_targetDict setValue:dict forKey:key];
}
//
-(void)removeTarget:(id)aTarget forEvent:(NSInteger)aEvent {
NSString *key = [NSString stringWithFormat:@"%zd",aEvent];
if ([[_targetDict allKeys] containsObject:key]) {
[_targetDict removeObjectForKey:key];
}
}
@end
方案3#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface WeakProxy : NSProxy // @property (nullable, nonatomic, weak, readonly) id target; // -(instancetype)initWithTarget:(id)target; +(instancetype)proxyWithTarget:(id)target; NS_ASSUME_NONNULL_END @end
#import "WeakProxy.h"
@implementation WeakProxy
- (instancetype)initWithTarget:(id)target {
_target = target;
return self;
}
+ (instancetype)proxyWithTarget:(id)target {
return [[WeakProxy alloc] initWithTarget:target];
}
- (id)forwardingTargetForSelector:(SEL)selector {
return _target;
}
- (void)forwardInvocation:(NSInvocation *)invocation {
void *null = NULL;
[invocation setReturnValue:&null];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
return [_target methodSignatureForSelector:selector];
}
- (BOOL)respondsToSelector:(SEL)aSelector {
return [_target respondsToSelector:aSelector];
}
@end
#import <Foundation/Foundation.h> @interface Manager : NSObject - (void)addTarget:(id)aTarget selector:(SEL)aSelector forEvent:(NSInteger)aEvent; - (void)removeTarget:(id)aTarget forEvent:(NSInteger)aEvent; @end
#import "Manager.h"
#import "WeakProxy.h"
@interface Manager ()
@property (nonatomic, strong) NSMutableDictionary *targetDict;
@end
@implementation Manager
- (id)init {
self = [super init];
if (self) {
_targetDict = [[NSMutableDictionary alloc] initWithCapacity:0];
}
return self;
}
- (void)addTarget:(id)aTarget selector:(SEL)aSelector forEvent:(NSInteger)aEvent {
WeakProxy *proxy = [WeakProxy proxyWithTarget:aTarget];
NSString *key = [NSString stringWithFormat:@"%zd",aEvent];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:0];
[dict setValue:proxy forKey:@"target"];
[dict setValue:NSStringFromSelector(aSelector) forKey:@"action"];
[_targetDict setValue:dict forKey:key];
}
- (void)removeTarget:(id)aTarget forEvent:(NSInteger)aEvent {
NSString *key = [NSString stringWithFormat:@"%zd",aEvent];
if ([[_targetDict allKeys] containsObject:key]) {
[_targetDict removeObjectForKey:key];
}
}
@end
好啦,到这我想到的解决方案就是这些了。有兴趣的可以比较方案1、2、3的区别!! (责任编辑:最模板) |

zencart手机数码模板
人气:2065
仿麦包包shopex模板
人气:427
免费ecshop仿京东商城2014整
人气:11568
仿1元云购精品程序源码
人气:9557
仿buychina多语言淘宝代购系
人气:1588
ecshop一号店2011最新模板
人气:2597