obj-c编程19:关联对象
来源:互联网 发布:flash软件官方下载 编辑:程序博客网 时间:2024/04/30 03:53
对于一些无法子类化的实例对象来说,如果希望将一个对象与其绑定该如何做呢?
以下示例虚构了一个HyConsoleAlert类,User类将会使用该类在控制台显示定制的告警。如果User中包括多个Alert类则需要手动关联处理每个对应的回调方法,这显得异常麻烦。可以使用objc提供的关联对象模式:将处理例程在生成Alert对象时就与之绑定好,较为漂亮的解决了这个问题。下面上源代码:
#import <Foundation/Foundation.h>static void *HyAlertkey = "HyAlertkey";@protocol HyMakeChoose-(void)makeChoose:(NSUInteger)index alertObject:(id)alertObj;@end@interface HyConsoleAlert:NSObject{@private NSString *_title,*_msg; id <HyMakeChoose> __weak _delegate;}-(HyConsoleAlert*)initWithTitle:(NSString *) title andMsg:(NSString *) msg andDelegate:(id <HyMakeChoose>)delegate;-(void)show;@end@implementation HyConsoleAlert-(id)init{ [NSException raise:@"ERR!" format:@"Invalid init method in HyConsoleAlert"]; return nil;}-(HyConsoleAlert*)initWithTitle:(NSString *) title andMsg:(NSString *) msg andDelegate:(id <HyMakeChoose>) delegate{ self = [super init]; if(self){ _title = [title copy]; _msg = [msg copy]; _delegate = delegate; } return self;}-(void)show{ NSLog(@"%@\n%@",_title,_msg); NSLog(@"Yes or No?"); int c; while(true){ c = getchar(); NSLog(@"DEBUG:getchar : '%c'",c); if(c == 'y' || c == 'Y') c = 1; else if(c == 'n' || c == 'N') c = 0; else continue; [_delegate makeChoose:c alertObject:self]; break; }}@end@interface User:NSObject <HyMakeChoose>{ id _alert;}-(void)askUserQuestion;@end@implementation User-(id)init{ self = [super init]; return self;}-(void)askUserQuestion{ HyConsoleAlert *alert = [[HyConsoleAlert alloc] initWithTitle:@"hopy' question" andMsg:@"Are you human being" andDelegate:self]; void (^block)(NSUInteger) = ^(NSUInteger index){ if(index == 1) NSLog(@"your choose: YES!"); else if(index == 0) NSLog(@"your choose : NO!"); else NSLog(@"error!!!"); }; objc_setAssociatedObject(alert,HyAlertkey,block, OBJC_ASSOCIATION_COPY); [alert show];}-(void)makeChoose:(NSUInteger)index alertObject:(id)alertObj{ NSLog(@"alertObj is %@",alertObj); void (^block)(NSUInteger) = objc_getAssociatedObject(alertObj,HyAlertkey); block(index);/* if(index == 1) NSLog(@"your choose: YES!"); else if(index == 0) NSLog(@"your choose : NO!"); else NSLog(@"error!!!");*/}@endint main(void){ @autoreleasepool{ /* User *user = [User new]; HyConsoleAlert *alert = [[HyConsoleAlert alloc]initWithTitle:@"warning" andMsg:@"Are you human being?" andDelegate:user]; [alert show]; */ User *user = [User new]; [user askUserQuestion]; } return 0;}
0 0
- obj-c编程19:关联对象
- obj-c编程12:复制对象
- Obj-c面向对象
- obj-c编程13:归档
- obj-c编程01:第一个类和对象的范例
- obj-c编程01[扩展学习01]:对象消息机制工作原理
- obj-c编程10:Foundation库中类的使用(5)[时间对象]
- OBJ-C类和对象学习笔记
- obj-c txt 关联。关系 txt输入框操作
- obj-c txt 关联。关系 txt输入框操作
- obj-c编程04:类的继承
- obj-c编程07:异常处理
- obj-c编程08:分类和协议
- obj-c编程09:块的语法
- obj-c编程16:键值编码(KVC)
- obj-c编程17:键值观察(KVO)
- obj-c编程06:反射与元编程初步
- OBJ-C对象的存储细节学习笔记
- 怎样在Windows系统中获取开源软件SVN更多的Revision记录
- 《开源框架那点事儿16》:缓存相关代码的演变
- MySQL用户及权限设置
- How to Install Docker on Ubuntu 14.04 LTS
- 事件的传递(一篇老外的博客)
- obj-c编程19:关联对象
- 诸葛io 大数据时代,企业如何打好信息资源整合攻坚战?
- android 绘制椭圆 圆角矩形 详细解析
- shader中的z、stencil、alpha测试
- SQL*LOADER的使用总结
- visitor模式
- [MFC]传统控件:控件简介以及CButton按钮类
- 元组
- codeblock中 启动 ROS 节点