相关疑难解决方法(0)

什么是objc_setAssociatedObject()以及在什么情况下应该使用它?

在我接受的一个项目中,原作者选择使用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)

如果设备已经是实例变量,那么将设​​备与视图控制器关联起来有什么意义呢?

iphone objective-c objective-c-runtime

67
推荐指数
4
解决办法
2万
查看次数

在类别接口/实现中设置新属性

好的,所以我有这个,但它不会工作:

@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和崩溃.有任何想法吗?谢谢

汤姆

objective-c categories ios

14
推荐指数
1
解决办法
3万
查看次数

如何在Obj-C类别中"伪造"ivars(iPhone)

更新:

iPhone OS 3.1具有关联的对象.但是,iPhone模拟器没有.如果要在模拟器中测试关联对象代码,则应该提交错误.

在这里看到我的问题.

rdar:// 7477326


Snow Leopard现在有相关的对象.

有没有办法在没有相关对象的情况下完成类似的事情?(专门针对iPhone.)

我很确定我曾经看过这样的事情,但我不记得在哪里.关于将任何对象转换为KVC容器的事情.

iphone cocoa cocoa-touch objective-c

6
推荐指数
1
解决办法
3867
查看次数