8

这段代码:

__weak VeryCool *weakSelf = self;
something.changeHandler = ^(NSUInteger newIndex) {
    if (newIndex == 0) {
        [weakSelf.options removeObjectForKey:@"seller"];
    }
};

警告我找不到属性选项。这是真的,因为 options 是一个 ivar,但没有声明为属性。是否有可能以某种方式从 weakSelf 获得选项而不将其声明为属性?

4

2 回答 2

26

对于直接 ivar 访问,请使用->. 例如:

__weak VeryCool *weakSelf = self;
something.changeHandler = ^(NSUInteger newIndex) {
    if (newIndex == 0) {
        VeryCool* strongSelf = weakSelf;
        if (strongSelf)
            [strongSelf->options removeObjectForKey:@"seller"];
    }
};

重要的是检查它strongSelf是非的nil,因为直接访问实例变量会因nil指针而崩溃(这与使用接收器调用方法不同nil,属性访问只是方法调用)。

于 2013-02-12T00:10:11.367 回答
3

直接取消引用弱指针来获取 ivar 是不可能的;nil由于自动行为引起的竞争条件,试图这样做是编译器错误。

KVC 将为您获取 ivar,但是:

[weakSelf valueForKey:@"options"]

这将查找具有相同名称的访问器方法。如果没有找到,它将依靠获取 ivar 本身。

由于消息的接收者valueForKey:是弱引用,nil如果对象已被释放,则消息将发送无操作。因此,您不必再次重新分配self以手动说服 AutomaticRC 执行您想要的操作。

于 2013-02-12T00:07:25.873 回答