iOS:块中的实例变量

时间:2015-10-20 03:53:45

标签: ios pointers block lifecycle weak

My Object有一些实例变量,如下所示:

@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;

你能帮我解释一下这个错误的原因吗。

1 个答案:

答案 0 :(得分: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