Предположим, что локальная переменная назначена так:
NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]];
Теперь передайте эту переменную объектному методу, например, setPlaceholder объекта UISearchBar
[self.theSearchBar setPlaceholder:placeHolder];
Как правильно освободить назначенную строку placeHolder?
Если вы полагаете, что autoreleas это:
NSString *placeHolder = [[NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]] autorelease];
ваш код завершится с ошибкой bad_exc_access
Если вы думаете выпустить переменную после передачи в другое место, например
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release];
исключение будет также выдано во время выполнения.
Так что не так?
Проблема в сохранении счета. Объект UISearchBar еще выделен, поэтому, если вы освобождаете или автоматически освобождаете такую переменную, на которую ссылается этот объект, то счетчик сохранений остается тем же
NSLog(@"Retain count before assign to refer other object %d", [placeHolder retainCount]);
[self.theSearchBar setPlaceholder:placeHolder];
NSLog(@"Retain count after referencing %d", [placeHolder retainCount]);
Итак, как с этим справиться?
Попробуйте что-то вроде следующего
[placeHolder retain]; // retainCount +1
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release]; // retainCount -1
Что мы сделали, чем? Давайте теперь посмотрим на счет удержания
NSLog(@"Retain count before doing retain %d", [placeHolder retainCount]);
[placeHolder retain]; // retainCount +1
NSLog(@"Retain count after retaining it %d", [placeHolder retainCount]);
Итак, мы увеличили счетчик сохранности перед тем, как присвоить его (получить ссылку на) какому-либо объекту, а после этого - локально этой переменной.
Вот и все.