AFNetworking:访问变量外部块是否安全?

时间:2018-05-17 19:01:16

标签: objective-c afnetworking objective-c-blocks

我正在尝试在块外存储变量时调试问题。

- (void) setObj : (NSString *) abc {
    [self postURL:@"..." params:@{"abc" : abc} completionHandler:^(id response) {

        [[SharedPref sharedInstance] setX:response];
        [[SharedPref sharedInstance] setAbc:abc]; <-- can we safely do this?

    } failureHandler:^(SBError *error) {

    }];
}

我见过的情况是,在以后我尝试访问abc的时候,我得到空字符串。

[[SharedPref sharedInstance] getAbc]; <-- this return empty string

2 个答案:

答案 0 :(得分:1)

只要abc中的SharedPref属性为strongcopy,它就应该是安全的。对于NSString*类型,首选使用copy

@interface SharedPref : NSObject
@property (copy,nonatomic) NSString* abc;
@end

区别如下:

<强> strong

  • strong表示该类拥有该属性

  • strong将属性的引用计数增加1

  • 实例在引用计数为0之前不会被释放。

<强> copy

  • 通过调用[copy]

  • 分配属性时,复制分配浅拷贝
  • copy确保您始终处理不可变属性。如果传入了一个可变属性,它将复制它。如果传入了不可变属性,它将保留它(你需要解除它)。

答案 1 :(得分:1)

你在做什么没有错。块捕获局部变量abc(它是指向对象的指针),块内的abc将是指向同一对象的指针。假设它是一个不可变的字符串或者你永远不会改变字符串,它应该是传递给setAbc:的相同字符串。

鉴于postURL:是一个异步操作(即在稍后某个未确定的时间调用完成块),我怀疑你是否对操作的顺序做出了错误的假设。到setAbc:时,getAbc的完成块可能尚未被调用,因此您在设置之前获得的是初始值。