Почему одновременная установка ivar приводит к ошибкам доступа? - PullRequest
0 голосов
/ 08 июля 2019

Я хочу напрямую присвоить значение ивару класса одновременно.

Я знаю, что возникнет проблема с использованием метода установки (self.target = ...), так как ARC сохраняет и освобождает содержимое для свойства strong. Но я пытаюсь использовать ivar.

  1. Это потому, что неявный квалификатор __strong?Но _target - это ивар, поэтому он не будет выпущен вне каждого блока 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 Ответ

1 голос
/ 08 июля 2019

Использование ivar не имеет значения: компилятор просто добавляет retain / release вместо вас.Вам необходимо unsafe_unretained свойство, чтобы отключить вставку сохранения / выпуска

...