【问题标题】:AFNetworking: is it safe to access variable outside block?AFNetworking:访问块外的变量是否安全?
【发布时间】:2018-05-17 19:01:15
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    区别如下:

    strong

    • strong 表示该类拥有该属性

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

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

    copy

    • copy在通过调用[copy]分配属性时分配浅拷贝

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

    【讨论】:

    • 好的,现在 setObj 的调用者是这样的有关系吗:[self setObj:[[SharedPref sharedInstance] getAbc]];
    • 在这种情况下self 是什么? objstrong 还是 weak 属性?在问题中包含场景可能会有所帮助
    • self AFHTTPSessionManager 单例
    • 当我调用 [[SharedPref sharedInstance] setAbc:abc];传递 abc 本质上是它的当前值,它是否有可能是一个空字符串/nil?
    • 谢谢,我终于知道问题出在服务器端了。误报:)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2014-12-20
      • 2020-09-10
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      相关资源
      最近更新 更多