使用" valueForKey:"访问私有变量但得到运行时错误

时间:2016-06-24 18:38:26

标签: ios objective-c

我创建了一个MyService课程,我将其设为 singleton ,如下所示:

标题:

@interface MyService : NSObject
+(MyService *)sharedInstance;
@end

实现:

@implementation MyService {
    dispatch_queue_t queue;
}

+ (VADispatchQueue *)sharedInstance {
    static MyService *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyService  alloc] init];
        queue = dispatch_queue_create("my.custom.queue", NULL);
    });
    return sharedInstance;
}

...
@end

如上所述,我在dispatch_queue_t queue类中定义了私有变量MyService

在另一个类中,我尝试通过以下方式访问此私有变量:

dispatch_queue_t queue = [[MyService sharedInstance] valueForKey:@"queue"];

但是上面的代码会导致运行时错误

caught "NSUnknownKeyException", "[<MyService 0x7a068440> valueForUndefinedKey:]: this class is not key value coding-compliant for the key queue."

为什么我收到此错误? (我有另一个地方使用相同的方式访问另一个类的BOOL私有变量,它在那里工作正常)

2 个答案:

答案 0 :(得分:2)

正如我昨天(今天?)解释的那样,键值编码从键形成了访问器选择器。您没有要在选择器上执行的访问器方法。 (对于协议:它可以直接访问ivars,请参阅+accessInstanceVariablesDirectly,但您不想这样做。)

将其作为财产。这将自动添加访问者。或者手动实现访问者。

答案 1 :(得分:0)

问题是因为它的ivar变量和KVC使用属性。所以你需要创建属性而不是ivar变量。