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

时间:2019-07-08 07:16:03

标签: objective-c grand-central-dispatch nstaggedpointerstring

我想直接将值同时直接分配给类的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;
}

1 个答案:

答案 0 :(得分:1)

使用ivar没什么区别:编译器只是添加保留/释放而不是您。您需要unsafe_unretained属性以禁止插入保留/释放