работа с автоматически выпущенными объектами в dispatch_sync - PullRequest
0 голосов
/ 05 ноября 2018

Как лучше всего избежать плохого доступа в подобных ситуациях?

__block NSString* string;
dispatch_sync(dispatch_get_main_queue(), ^{
    string = [NSString stringWithString:@"I'm autoreleased!"];
});

NSLog(@"My string is: %@", string);

Я изменил свой код на это:

NSMutableString *string = [[NSMutableString alloc] init];
dispatch_sync(dispatch_get_main_queue(), ^{
       [string appendString:@"I'm autoreleased!"];
});

NSLog(@"My string is: %@", string);
[string release];

но мне было интересно, нет ли лучшего решения

1 Ответ

0 голосов
/ 31 декабря 2018

Поскольку вы звоните release, вы должны использовать ручной подсчет ссылок. При ручном подсчете ссылок, когда вы сохраняете что-то в переменной, которая переживет область действия, вы должны сохранить ее, а затем, если впоследствии вы назначите что-то этой переменной или закончится время жизни этой переменной, вам нужно сначала освободить эту переменную.

Так что вы можете сделать это:

__block NSString* string;
dispatch_sync(dispatch_get_main_queue(), ^{
    string = [[NSString stringWithString:@"I'm autoreleased!"] retain];
    // or equivalently:
    // string = [[NSString alloc] initWithString:@"I'm autoreleased!"];
});

NSLog(@"My string is: %@", string);
[string release];
...