Я хочу напрямую присвоить значение ивару класса одновременно.
Я знаю, что возникнет проблема с использованием метода установки (self.target = ...
), так как ARC сохраняет и освобождает содержимое для свойства strong
. Но я пытаюсь использовать ivar.
Это потому, что неявный квалификатор __strong
?Но _target
- это ивар, поэтому он не будет выпущен вне каждого блока 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;
}