我正在尝试在块外存储变量时调试问题。
- (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
答案 0 :(得分:1)
只要abc
中的SharedPref
属性为strong
或copy
,它就应该是安全的。对于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
的完成块可能尚未被调用,因此您在设置之前获得的是初始值。