可以在块中使用self的ivar(而不是使它们成为属性)

0xS*_*ina 6 cocoa-touch objective-c ios

这段代码:

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

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

Ken*_*ses 23

如需直接进入ivar,请使用->.例如:

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

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

  • 你在块中制作强指针.在块运行之前不会发生保留,并且在块完成之前释放. (4认同)
  • objc_msgSend安全地处理消息弱引用(毕竟objc_msgSend-to-nil是安全的).它没有注意的是确保多条消息全部通过.可以编写代码,使其行为符合您的预期,即使N个消息中的任何一个意外地具有nil接收器,但如果您确保事先确定事情通常更容易推理. (4认同)
  • weakSelf可以在if(weakSelf == nil)和使用它之间变为零.线程很难. (2认同)