为什么同时设置 ivar 会导致访问错误?
Why concurrently setting ivar makes bad access error?
我想同时直接给class的ivar赋值。
我知道使用 setter 方法 (self.target = ...
) 会有问题,因为 ARC 内部为 strong
属性 保留和释放内容。 但我正在尝试使用 ivar。
是不是因为隐式限定符__strong
?但是 _target
是一个ivar,所以它不会在每个 dispatch_async 块之外发布,对吗?
并且如果您缩短字符串,iOS 系统将应用标记指针到 _target
,为什么在这种情况下不会再发生错误访问错误?
@interface ClassA ()
@property (nonatomic, strong) NSString *target;
@end
@implementation ClassA
- (void)test {
dispatch_queue_t queue = dispatch_queue_create("parallel", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10000 ; i++) {
dispatch_async(queue, ^{
_target = [NSString stringWithFormat:@"aaaaaaaaaaaaaa-%d",i]; //Bad Access Error in releasing, an NSCFString
//_target = [NSString stringWithFormat:@"aa-%d",i]; //No problem, an NSTaggedPointerString
});
}
}
@end
int main(int argc, char * argv[]) {
ClassA *obj = [[ClassA alloc] init];
[obj test];
return 0;
}
使用 ivar
没有区别:编译器只是添加 retain/release 而不是你。您需要 unsafe_unretained
属性 来禁止插入 retain/release
我想同时直接给class的ivar赋值。
我知道使用 setter 方法 (self.target = ...
) 会有问题,因为 ARC 内部为 strong
属性 保留和释放内容。 但我正在尝试使用 ivar。
是不是因为隐式限定符
__strong
?但是_target
是一个ivar,所以它不会在每个 dispatch_async 块之外发布,对吗?并且如果您缩短字符串,iOS 系统将应用标记指针到
_target
,为什么在这种情况下不会再发生错误访问错误?
@interface ClassA ()
@property (nonatomic, strong) NSString *target;
@end
@implementation ClassA
- (void)test {
dispatch_queue_t queue = dispatch_queue_create("parallel", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10000 ; i++) {
dispatch_async(queue, ^{
_target = [NSString stringWithFormat:@"aaaaaaaaaaaaaa-%d",i]; //Bad Access Error in releasing, an NSCFString
//_target = [NSString stringWithFormat:@"aa-%d",i]; //No problem, an NSTaggedPointerString
});
}
}
@end
int main(int argc, char * argv[]) {
ClassA *obj = [[ClassA alloc] init];
[obj test];
return 0;
}
使用 ivar
没有区别:编译器只是添加 retain/release 而不是你。您需要 unsafe_unretained
属性 来禁止插入 retain/release