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
属性是strong
或copy
就应该是安全的。对于 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
时尚未被调用,因此您得到的是设置它之前的初始值。
我正在尝试调试在块外存储变量时出现的问题。
- (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
属性是strong
或copy
就应该是安全的。对于 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
时尚未被调用,因此您得到的是设置它之前的初始值。