Object - C运行时应用(二)—— 使用对象关联为分类增加属性(每个对象的属性互不干扰)
2015-03-16 20:50
531 查看
一、对象的关联方法有
1、 void objc_setAssociatedObject(id object, const void *key, id value,objc_AssociationPolicy policy) ,关联对象(将值value与对象object关联起来)
参数key:将来可以通过key取出这个存储的值
参数policy:存储策略(assign、copy、retain)
2、 id objc_getAssociatedObject(id object, const void *key) ,利用参数key将对象中存储的对应值取出
二、利用分类为每个对象添加属性(可作为对象的标签或存储信息)
声明代码:
实现代码:
测试:
打印如下:
这样连字符串页具备了一个数组属性。
三、对象关联的另一种作用:在既有类中使用关联对象存放自定义数据
在ios开发时经常会用到UIAlertView类,该类提供了一种视图向用户展示警告信息。该类通过代理协议来处理用户的点击事件,但由于使用了代理就必须把创建警告的视图和处理按钮动作的代码分开,比如说
如果想在同一个类里处理多个警告信息视图,我们必须在代理方法中比较点击按钮的索引,并借此编写相应的逻辑,如果能够在创建警告视图的时候直接把处理逻辑的代码写好那将会很便于阅读,这时可以考虑用关联对象,设定一个与alert对象关联的代码块,等到执行代理方法时再将其读取出来
执行效果如下:
1、 void objc_setAssociatedObject(id object, const void *key, id value,objc_AssociationPolicy policy) ,关联对象(将值value与对象object关联起来)
参数key:将来可以通过key取出这个存储的值
参数policy:存储策略(assign、copy、retain)
2、 id objc_getAssociatedObject(id object, const void *key) ,利用参数key将对象中存储的对应值取出
二、利用分类为每个对象添加属性(可作为对象的标签或存储信息)
声明代码:
@interface NSObject (CX) /** * 为每一个对象添加一个name属性 */ @property (nonatomic,copy) NSString *name; /** * 为每个对象添加一个数组属性 */ @property (nonatomic,strong) NSArray *books; @end
实现代码:
// 用一个字节来存储key值,设置为静态私有变量,避免外界修改 static char nameKey; - (void)setName:(NSString *)name { // 将某个值与某个对象关联起来,将某个值存储到某个对象中 objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC); } - (NSString *)name { return objc_getAssociatedObject(self, &nameKey); } static char booksKey; - (void)setBooks:(NSArray *)books { objc_setAssociatedObject(self, &booksKey, books, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (NSArray *)books { return objc_getAssociatedObject(self, &booksKey); }
测试:
NSString *str = @"xx"; str.name = @"oo"; str.books = @[@"xxoo",@"ooxx"]; NSLog(@"%@,%@",str.name,str.books);
打印如下:
这样连字符串页具备了一个数组属性。
三、对象关联的另一种作用:在既有类中使用关联对象存放自定义数据
在ios开发时经常会用到UIAlertView类,该类提供了一种视图向用户展示警告信息。该类通过代理协议来处理用户的点击事件,但由于使用了代理就必须把创建警告的视图和处理按钮动作的代码分开,比如说
- (void)showAlertView { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView" message:@"what do you do" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"sure", nil]; [alert show]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (0 == buttonIndex) { NSLog(@"%@",@"cancel"); } else if (1 == buttonIndex) { NSLog(@"%@",@"sure"); } }
如果想在同一个类里处理多个警告信息视图,我们必须在代理方法中比较点击按钮的索引,并借此编写相应的逻辑,如果能够在创建警告视图的时候直接把处理逻辑的代码写好那将会很便于阅读,这时可以考虑用关联对象,设定一个与alert对象关联的代码块,等到执行代理方法时再将其读取出来
- (void)viewDidLoad { [super viewDidLoad]; [self showAlertView]; } static char myAlerViewKey; - (void)showAlertView { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView" message:@"what do you do" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"sure", nil]; // 将逻辑定义到代码块里面 void(^block)(NSInteger) = ^(NSInteger buttonIndex) { if (buttonIndex == 0) { NSLog(@"%ld",buttonIndex); } else { NSLog(@"%ld",buttonIndex); } }; // 对象关联 objc_setAssociatedObject(alert, &myAlerViewKey, block, OBJC_ASSOCIATION_COPY); [alert show]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { void(^block)(NSInteger) = objc_getAssociatedObject(alertView, &myAlerViewKey); block(buttonIndex); }
执行效果如下:
相关文章推荐
- Runtime应用(二)使用对象关联为分类增加属性(每个对象的属性互不干扰)
- 使用对象关联为分类增加属性(每个对象的属性互不干扰)
- iOS在分类中声明属性的方法(不提倡使用)以及关联对象介绍
- Sharepoint2010应用开发四:使用客户对象模型(Client Object Model)向SharePoint列表写数据
- WCF:读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- 运行时简单使用-->获取对象的属性(class_copyIvarList)
- 使用XStream将XML转化成对象,忽略没有关联的属性
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- js object 对象 属性和方法的使用
- iOS运行时应用场合二 获取对象属性
- 使用new调用构造器创建对象并统一添加属性的代码运行过程
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- 使用类、类属性、对象属性 分类: python基础学习 2014-03-19 16:22 220人阅读 评论(0) 收藏
- iOS运行时机制之成员和属性,关联对象
- struts2 if 标签的使用 已经使用迭代取出List中的Object对象中的属性
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。【轉】
- iOS在分类中添加属性,运行时编程,objc runtime 动态增加属性
- 通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxArrayLength 属性,可增加此配额
- 分类添加属性,运行时添加对象属性和基本类型属性
- iOS 运行时runtime应用之二--在category中使用运行时API给类添加属性