iOs是怎么ios 关联对象原理的

Associated Objects(关联对象)或者叫作关联引用(Associative References),是作为Objective-C 2.0 运行时功能被引入到 Mac OS X 10.6 Snow Leopard(及iOS4)系统。与它相关在&objc/runtime.h&中有3个C函数,它们可以让对象在运行时关联任何值:
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
OBJC_EXPORT void objc_removeAssociatedObjects(id object)
为什么这几个方法很有用呢?因为开发者可以通过它们在分类中给已存在的类中添加自定义属性。
关于前两个函数中的&key&值是我们需要重点关注的一个点,这个&key&值必须保证是一个对象级别(为什么是对象级别?看完下面的章节你就会明白了)的唯一常量。一般来说,有以下三种推荐的&key&值:
声明&static char kAssociatedObjectK&,使用&&kAssociatedObjectKey&作为&key&值;
声明&static void *kAssociatedObjectKey = &kAssociatedObjectK&,使用&kAssociatedObjectKey&作为&key&值;
用&selector&,使用&getter&方法的名称作为&key&值。
我个人最喜欢的(没有之一)是第&3&种方式,因为它省掉了一个变量名,非常优雅地解决了计算科学中的两大世界难题之一(命名)。
在给一个对象添加关联对象时有五种关联策略可供选择:
OBJC_ASSOCIATION_ASSIGN
等价于@property (assign) ,
@property (unsafe_unretained)
弱引用关联对象
OBJC_ASSOCIATION_RETAIN_NONATOMIC
等价于@property (strong, nonatomic)
强引用关联对象,且为非原子操作
OBJC_ASSOCIATION_COPY_NONATOMIC
等价于@property (copy, nonatomic)
复制关联对象,且为非原子操作
OBJC_ASSOCIATION_RETAIN
等价于@property (strong, atomic)
强引用关联对象,且为原子操作
OBJC_ASSOCIATION_COPY
等价于@property (copy, atomic)
复制关联对象,且为原子操作
其中,第 2 种与第 4 种、第 3 种与第 5 种关联策略的唯一差别就在于操作是否具有原子性。
objc_setAssociatedObject(button, buttonKey, _imgView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
1、倒入头文件,声明key:
#import &objc/runtime.h&
char* const buttonKey = "buttonKey";
2、设置关联:
if (groupModel.isOpened) {
UIImageView * _imgView = [[UIImageView alloc]initWithFrame:CGRectMake(10, (44-16)/2, 14, 16)];
[_imgView setImage:[UIImage imageNamed:@"ico_list"]];
[sectionView addSubview:_imgView];
CGAffineTransform currentTransform = _imgView.
CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform, M_PI/2); // 在现在的基础上旋转指定角度
_imgView.transform = newT
objc_setAssociatedObject(button, buttonKey, _imgView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
UIImageView * _imgView = [[UIImageView alloc]initWithFrame:CGRectMake(10, (44-16)/2, 14, 16)];
[_imgView setImage:[UIImage imageNamed:@"ico_list"]];
[sectionView addSubview:_imgView];
objc_setAssociatedObject(button, buttonKey, _imgView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
3、获取关联:
- (void)buttonPress:(UIButton *)sender//headButton点击
GroupModel *groupModel = dataSource[sender.tag];
UIImageView *imageView =
objc_getAssociatedObject(sender,buttonKey);
if (groupModel.isOpened) {
[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionTransitionNone animations:^{
CGAffineTransform currentTransform = imageView.
CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform, -M_PI/2); // 在现在的基础上旋转指定角度
imageView.transform = newT
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.3 delay:0.0 options: UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveLinear animations:^{
CGAffineTransform currentTransform = imageView.
CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform, M_PI/2); // 在现在的基础上旋转指定角度
imageView.transform = newT
} completion:^(BOOL finished) {
groupModel.isOpened = !groupModel.isO
[expandTable reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:UITableViewRowAnimationAutomatic];
阅读(...) 评论()iOS中关联对象objc_setAssociatedObject的简单使用(传值使用) - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 16时,
iOS中关联对象objc_setAssociatedObject的简单使用(传值使用)
代码片段(1)
1.&[代码]iOS中关联对象objc_setAssociatedObject的简单使用(传值使用)&&&&
#import "wangmumu.h"
@interface wangmumu ()
static char staticS
@implementation SHVCarsViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.edgesForExtendedLayout=UIRectEdgeN
self.tableView.hidden = YES;
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
btn.backgroundColor = [UIColor grayColor];
[btn addTarget:self action:@selector(btnn:) forControlEvents:UIControlEventTouchUpInside];
objc_setAssociatedObject(btn, &staticString, @"aaaa", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self.view addSubview:btn];
- (void)btnn:(UIButton *)btn{
NSString *str = objc_getAssociatedObject(btn, &staticString);
NSLog(@"%@",str);
objc_setAssociatedObject(btn, &staticString, @"aaaa", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
有四个参数
1.被关联的对象
2.要关联的对象的键值,一般设置成静态的,用于获取关联对象的值
3.要传得值 一般是静态变量
4.关联时采用的协议,有assign,retain,copy等协议 点击进去选取枚举
但我们不需要关联时。需要移除关联
objc_setAssociatedObject(self, &staticString, nil, OBJC_ASSOCIATION_ASSIGN);
开源中国-程序员在线工具:
相关的代码(545)
0回/1136阅
[Objective-C]
[Objective-C]
[Objective-C]
[Objective-C]
[Objective-C]
[Objective-C]
[Objective-C]
[Objective-C]
[Objective-C]
[Objective-C]
开源从代码分享开始
韩万杰的其它代码拒绝访问 | www.wangchao.net.cn | 百度云加速
请打开cookies.
此网站 (www.wangchao.net.cn) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(4c4cc6-ua98).
重新安装浏览器,或使用别的浏览器iOS开发--Runtime的简单使用之关联对象 - Alex_LoveYing - 博客园
Stay Hungry,Stay Foolish.
一、Runtime关联对象的方法简介:
在&objc/runtime.h&中,有三个关联的方法,分别是:
objc_setAssociatedObject
objc_getAssociatedObject
objc_removeAssociatedObjects
1.1、设置关联
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
第一个参数:id object : 表示关联的源对象第二个参数:const void *key : 获取被关联者的索引key第三个参数:id value : 被关联者第四个参数:objc_AssociationPolicy policy : 关联策略,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC
objc_AssociationPolicy是一个枚举类型,一共为5种:
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = <span style="color: #,
/**& Specifies a weak reference to the associated object. */
OBJC_ASSOCIATION_RETAIN_NONATOMIC = <span style="color: #, /**& Specifies a strong reference to the associated object.
The association is not made atomically. */
OBJC_ASSOCIATION_COPY_NONATOMIC = <span style="color: #,
/**& Specifies that the associated object is copied.
The association is not made atomically. */
OBJC_ASSOCIATION_RETAIN = <span style="color: #401,
/**& Specifies a strong reference to the associated object.
The association is made atomically. */
OBJC_ASSOCIATION_COPY = <span style="color: #403
/**& Specifies that the associated object is copied.
The association is made atomically. */
1.2、获取关联
id objc_getAssociatedObject(id object, const void *key)
第一个参数:id object : 表示关联的源对象第二个参数:const void *key : 获取被关联者的索引key
1.3、移除关联
void objc_removeAssociatedObjects(id object)
只有一个参数id object,是关联的源对象。作用就是移除object的所有关联。
二、Runtime关联对象的简单应用:
下面以UIButton为例,使用关联对象完成一个功能函数:为UIButton增加一个Category,定义一个方法,使用block去实现button的点击回调。
UIButton+Addition.h
#import &UIKit/UIKit.h&
#import &objc/runtime.h&
// 导入头文件
// 声明一个button点击事件的回调block
typedef void(^ButtonClickCallBack)(UIButton *button);
@interface UIButton (Addition)
// 为UIButton增加的回调方法
- (void)handleClickCallBack:(ButtonClickCallBack)callB
UIButton+Addition.m
#import "UIButton+Addition.h"
// 声明一个静态的索引key,用于获取被关联对象的值
static char *buttonClickK
@implementation UIButton (Addition)
- (void)handleClickCallBack:(ButtonClickCallBack)callBack {
// 将button的实例与回调的block通过索引key进行关联:
objc_setAssociatedObject(self, &buttonClickKey, callBack, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
// 设置button执行的方法
[self addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
- (void)buttonClicked {
// 通过静态的索引key,获取被关联对象(这里就是回调的block)
ButtonClickCallBack callBack = objc_getAssociatedObject(self, &buttonClickKey);
if (callBack) {
callBack(self);
在UIViewController中,导入我们写好的UIButton分类头文件,定义一个button对象,调用分类中的这个方法:
[self.testButton handleClickCallBack:^(UIButton *button) {
NSLog(@"click...");}];
以上我们完成了runtime关联对象的简单使用,对于UIButton一般的点击事件而言,我们可以在block回调中进行对点击事件的处理,而不用再去调用:
- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlE
这样做,提高了我们的开发效率。对于UIView、UIAlertView等等,我们也可以这样做。
不妨去试试,写一个属于自己的工具类,快速效率的进行开发。iOS中用静态方法创建的全局对象,用button绑定方法,方法中使用了这个对象,系统运行崩溃,_百度知道
iOS中用静态方法创建的全局对象,用button绑定方法,方法中使用了这个对象,系统运行崩溃,
但是为什么直接用self来调此方法不崩溃?????????
静态方法来创建的对象,声明为全局后,对象由系统释放,如果不保留一次引用计数的话,再使用该对象时出现崩溃
_arr2=[NSArray arrayWithObject:@&1&];
NSLog(@&arr2的引用计数==%d...
我有更好的答案
public void actionPerformed(ActionEvent e)
if(e.getSource()==xinjian)
text.setText(&&);
if(e.getSource()==dakai)
openFD.show();
为您推荐:
其他类似问题
ios的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 hql 关联对象查询 的文章

 

随机推荐