2012-02-03 3 views
1

В моей функции ниже, если я удаляю оператор выпуска tempString, он работает просто отлично, но вместе с ним ВСЕГДА возникает ошибка времени выполнения. Это простая функция, которая отображает массив в NSTextField либо _stackDisp1 или _stackDisp2, но по какой-то причине освобождение строки создает ошибку времени выполнения. Любая помощь?Ошибка выполнения при выпуске объекта NSString

- (void) displayArr:(NSMutableArray*)stack{ 
    NSTextField *myObj; 
    if([stack count] <= 10) myObj = _stackDisp1; 
    else myObj = _stackDisp2; 
    NSString *tempString = [[NSString alloc]initWithString:@""]; 
    for(NSString *i in stack){ 
    tempString = [NSString stringWithFormat:@"%@\n%@",tempString,i]; 
    } 
    [myObj setStringValue:tempString]; 
    [tempString release]; 
} 
+0

Я думал, что если объект был создан с использованием alloc, программист отвечал за его освобождение. Почему это авто-релиз? –

+0

Тогда начальная 'tempString' была действительно создана с использованием' alloc' и должна была быть выпущена. Но так как вы никогда не трогаете его, заменив его экземплярами autoreleased ('stringWithFormat:') в вашем цикле for, это не обязательно в первую очередь. Замените строку 'initWithString:' на 'NSString * tempString = @" ";' и удалите '[tempString release];' или (и это то, что вы должны сделать, а не изобретать колесо) используйте код, который я опубликовано в моем ответе. Существует уже метод для того, что вы пытаетесь сделать, поэтому используйте его. – Regexident

ответ

1

Это потому, что

tempString = [NSString stringWithFormat:@"%@\n%@",tempString,i]; 

создает новый объект autoreleased назначая его в переменную tempString. Указатель на первый объект потеряется, и вы закончите чрезмерно освобождение объекта с автореализацией. Просто измените начальное назначение на

NSString *tempString = @""; 

и удалите линию [tempString release].

0

В течение цикла вы присваиваете tempString к autoreleased строки:

tempString = [NSString stringWithFormat:@"%@\n%@",tempString,i]; 

освободив его вручную приводит к BAD_ACCESS.

Кроме того, вы, вероятно, ищете это:

- (void) displayArr:(NSMutableArray*)stack{ 
    NSTextField *myObj = ([stack count] <= 10) ? _stackDisp1 : _stackDisp2; 
    [myObj setStringValue:[stack componentsJoinedByString:@"\n"]]; 
} 

Объявление/назначение myObj было немного слишком многословен, на мой вкус,
поэтому я использовал ternary operator вместо (это использование не essiential хотя Просто вопрос стиля.).

Смежные вопросы