Работа с автоматически выпущенными объектами в dispatch_sync
Как лучше всего избежать плохого доступа в подобных ситуациях?
__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];
но мне было интересно, если нет лучших решений
0 ответов
Так как ты звонишь 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];