在我接受的一个项目中,原作者选择使用objc_setAssociatedObject()
,我不是100%清楚它的作用或为什么决定使用它.
我决定查阅它,不幸的是,文档对其目的并不十分具有描述性.
objc_setAssociatedObject
使用给定的密钥和关联策略为给定对象设置关联值.
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
参数
object
关联的源对象.
key
关联的关键.
value
与对象的键键关联的值.通过nil清除现有关联.
policy
协会的政策.有关可能的值,请参阅"关联对象行为".
那么这个函数究竟做了什么以及在什么情况下应该使用它?
阅读答案后编辑
那么下面的代码有什么意义呢?
Device *device = [self.list objectAtIndex:[indexPath row]];
DeviceViewController *next = [[DeviceViewController alloc] initWithController:self.controller
device:device
item:self.rootVC.selectedItem];
objc_setAssociatedObject(device, &kDeviceControllerKey, next, OBJC_ASSOCIATION_RETAIN);
Run Code Online (Sandbox Code Playgroud)
如果设备已经是实例变量,那么将设备与视图控制器关联起来有什么意义呢?
好的,所以我有这个,但它不会工作:
@interface UILabel (touches)
@property (nonatomic) BOOL isMethodStep;
@end
@implementation UILabel (touches)
-(BOOL)isMethodStep {
return self.isMethodStep;
}
-(void)setIsMethodStep:(BOOL)boolean {
self.isMethodStep = boolean;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if(self.isMethodStep){
// set all labels to normal font:
UIFont *toSet = (self.font == [UIFont fontWithName:@"Helvetica" size:16]) ? [UIFont fontWithName:@"Helvetica-Bold" size:16] : [UIFont fontWithName:@"Helvetica" size:16];
id superView = self.superview;
for(id theView in [(UIView *)superView subviews])
if([theView isKindOfClass:[UILabel class]])
[(UILabel *)theView setFont:[UIFont fontWithName:@"Helvetica" size:16]];
self.font = toSet;
}
}
@end
Run Code Online (Sandbox Code Playgroud)
如果我取出getter和setter方法然后它不起作用它告诉我我需要创建一些getter和setter方法(或者使用@synthesize - 但是在@implementation中放入@synthesize也会引发错误).但是使用getter和setter方法,我得到一个EXC_BAD_ACCESS和崩溃.有任何想法吗?谢谢
汤姆
更新:
iPhone OS 3.1具有关联的对象.但是,iPhone模拟器没有.如果要在模拟器中测试关联对象代码,则应该提交错误.
在这里看到我的问题.
rdar:// 7477326
Snow Leopard现在有相关的对象.
有没有办法在没有相关对象的情况下完成类似的事情?(专门针对iPhone.)
我很确定我曾经看过这样的事情,但我不记得在哪里.关于将任何对象转换为KVC容器的事情.