Память / Obj-C правильное освобождение объекта. Что из этого требует освобождения? - PullRequest
0 голосов
/ 22 июля 2010

Хорошо, это элементарный вопрос, но я задаю его, потому что, честно говоря, я не понимаю, как правильно справиться с этим. Если я раскомментирую последние две строки, этот код вылетает, хотя я не думаю, что он должен.

Следующий код взят из пользовательского UILabel с подклассами, где я добавил следующий метод setTextFromFloat.

 -(void)setTextFromFloat:(float)newValue {  
 NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];  
 [formatter setMaximumFractionDigits:2];  
 [formatter setRoundingMode:NSNumberFormatterRoundUp];  

 NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:newValue]];  
 NSString *newLabelValue = [numberString stringByAppendingString:@"x"];  
 self.text = newLabelValue;  
 //[numberString release];  
 //[formatter release];  
}

Итак, здесь есть три объекта, которые меня смущают:

a) self.text (старое строковое значение) - когда это выпущено? Должен ли я освобождать старое содержимое self.text при вызове этой функции?

b) форматер, NSNumberFormatter, который я разместил здесь, почти наверняка нуждается в выпуске

в) как насчет numberString? Я просто использую его в качестве посредника для создания newLabelValue. если я выпущу его, я верю, что программа вылетает, но почему? Разве я не несу ответственности за использование памяти косвенным путем вызова stringFromNumber?

Любая мудрость высоко ценится, спасибо!

Ответы [ 3 ]

1 голос
/ 22 июля 2010

Отпустите только форматер в конце вашего setTextFromFloat: метода.

Поскольку ваш класс наследует от UILabel, self.text является частью класса UILabel и будет выпущен в методе UILabel dealloc, поэтому вам не нужно выпускать его самостоятельно, если в методе dealloc вашего подкласса вы вызываете [super dealloc].

numberString создается с использованием NSString.stringFromNumber:, поэтому он уже настроен на автоматическое высвобождение из внутреннего метода. Не отпускайте его вручную, иначе ваша программа потерпит крах.

1 голос
/ 22 июля 2010

Итак, здесь есть три объекта, которые меня смущают:

a) self.text (старое строковое значение) - Когда это будет выпущено?Должен ли я освобождать старое содержимое self.text при вызове этой функции?

self.text не является объектом, это свойство, что означает, что это пара методов доступа -text и-setText: Если у него есть переменная экземпляра, поддерживающая его, и она имеет семантику сохранения или копирования, вы должны освободить переменную экземпляра в -dealloc.

b) форматере, NSNumberFormatter, который я разместил здесьпочти наверняка требуется выпуск

Не "почти наверняка", но "безусловно".

c) как насчет numberString?Я просто использую его в качестве посредника для создания newLabelValue.если я выпущу его, я верю, что программа вылетает, но почему?Разве я не несу ответственности за использование памяти косвенно при вызове stringFromNumber?

Просмотрите Правила управления памятью какао .Вы получили numberString с помощью new, alloc или метода, содержащего copy?Нет, ты не сделал.Вы сохранили это?Нет, ты не сделал.Поэтому вы не должны выпускать его, потому что вы не являетесь его владельцем.Если вы хотите владеть им, отправьте ему -retain.Затем вы должны отпустить его, когда вам больше не нужно его держать.

0 голосов
/ 22 июля 2010

numberString не должно быть выпущено. Вы получаете его через удобный конструктор, поэтому он автоматически выпускается.

О вашем свойстве self.text, если вы не объявили его, вы не несете ответственности. В противном случае его необходимо разблокировать методом dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...