为什么同时设置 ivar 会导致访问错误?

Why concurrently setting ivar makes bad access error?

我想同时直接给class的ivar赋值。

我知道使用 setter 方法 (self.target = ...) 会有问题,因为 ARC 内部为 strong 属性 保留和释放内容。 但我正在尝试使用 ivar。

  1. 是不是因为隐式限定符__strong?但是 _target 是一个ivar,所以它不会在每个 dispatch_async 块之外发布,对吗?

  2. 并且如果您缩短字符串,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