Предположим, что локальная переменная назначена следующим образом
NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]];
Теперь передайте эту переменную методу, определенному объектом, например, setPlaceholder объекта UISearchBar.
[self.theSearchBar setPlaceholder:placeHolder];
Как правильно освободить назначенную строку «placeHolder»?
Если вы предполагаете его авторелиз:
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]);
Итак, мы увеличили счетчик сохранения, прежде чем присвоить его (получить ссылку) какому-либо объекту, а после этого мы локально освобождаем эту переменную.
Это все.
person
loretoparisi
schedule
22.07.2011