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

AFNetworking: is it safe to access variable outside block?

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

- (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

只要SharedPref中的abc属性是strongcopy就应该是安全的。对于 NSString* 类型,最好使用 copy.

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

区别如下:

strong:

  • strong表示class拥有属性

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

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

copy

  • copy 在调用 [copy]

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

你所做的没有错。局部变量 abc (它是一个对象的指针)被块捕获,并且块内的 abc 将是指向同一对象的指针。假设它是一个不可变的字符串,或者您从不改变该字符串,它应该与传递给 setAbc:.

的字符串相同

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