1

我的对象有一些实例变量,如下所示:

@interface MyObject : NSObject 
{
@private 
    NSDictionary * resultDictionary ;
}

这是方法:

- (void) doSomething
{
    __weak typeof(self) weakSelf = self ;

    [TaskAction invoke:^(NSDictionary* result){
        if(result){
            weakSelf->resultDictionary = result ; // dereferencing a weak pointer is not allowed due to possible null value caused by race condition , assign it to strong variable first ...
        }
    }]
}

iOS编译器抛出一个错误://由于竞争条件可能导致空值,不允许取消引用弱指针,首先将其分配给强变量...

错误语句是 :weakSelf->resultDictionary = result ;

你能帮我看看为什么会出错。

4

1 回答 1

3

您实际上不需要此代码中的弱引用。这里没有保留周期的风险。

但是,如果您这样做了,解决方案是为私有 ivar 创建一个属性。然后您可以通过块内的弱指针访问该属性。

旁注 - 不要将私有 ivars 放在公共界面中。没有充分的理由将私人细节放在公共界面中。将私有 ivar(或私有属性)放在 .m 文件的私有类扩展中。

.h 文件:

@interface MyObject : NSObject
@end

.m 文件:

@interface MyObject()

@property (nonatomic, strong) NSDictionary *resultDictionary;
@end

@implementation MyObject

- (void)doSomething {
    [TaskAction invoke:^(NSDictionary* result){
        if (result){
            self.resultDictionary = result;
        }
    }];
}

@end
于 2015-10-20T04:00:28.487 回答