Search code examples
objective-cafnetworkingobjective-c-blocks

AFNetworking: is it safe to access variable outside block?


I'm trying to debug an issue when storing variable outside a 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) {

    }];
}

I've seen cases where when in later time I try to access abc, I'm getting empty string.

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

Solution

  • It should be safe as long as the abc property in SharedPref is strong or copy. For NSString* types, it's preferred to use copy.

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

    The difference is as follows:

    strong:

    • strong indicates that the class owns the property

    • strong increases the reference count of the property by 1

    • instance will not be released until its reference count is 0.

    copy

    • copy assigns a shallow copy when assigning the property by calling [copy]

    • copy ensures that you're always dealing with an immutable property. If a mutable property is passed in, it will copy it. If a immutable property is passed in, it will retain it (you would need to dealloc it).