Странный __block сбой переменной хранилища - PullRequest
4 голосов
/ 29 июля 2011

У меня есть проблема в моем коде, которую я перевел к следующему (глупому) примеру

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];

__block NSString *a = @"-1";

[array enumerateObjectsUsingBlock:^(id whoCares, NSUInteger idx, BOOL *stop) {
    a = [NSString stringWithFormat:@"%@ %d", a, idx];
    NSLog(@"%@", a);
}];

NSLog(@"%@", a);

Этот код работает, но если я закомментирую первый NSLog (внутри блока) кодсбои.Но если я изменю строку формата на следующую

a = [NSString stringWithFormat:@"%d", idx];

, тогда код будет работать нормально без NSLog внутри блока.

Что здесь происходит?Надеюсь, я что-то недопонимаю.

1 Ответ

2 голосов
/ 29 июля 2011

stringWithFormat: дает вам автоматически выпущенный объект, который вы не сохраняете. К тому времени, как блок выйдет и вы позвоните NSLog, a может быть уже освобожден.

Одним из решений может быть использование изменяемой строки и добавление к ней каждый раз вместо переназначения.

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];

NSMutableString *a = [NSMutableString stringWithFormat:@"-1"];

[array enumerateObjectsUsingBlock:^(id whoCares, NSUInteger idx, BOOL *stop) {
    [a appendFormat:@" %d", idx];
}];

NSLog(@"%@", a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...