Идиоматическая короткая продолжительность жизни местных объектов сродни RAII - PullRequest
2 голосов
/ 13 октября 2011

Я натолкнулся на этот фрагмент Objective-C:

NSNumber *theBalance = 
    [[[NSNumberFormatter alloc] init]
     numberFromString: [textField text]];

Это похоже на утечку NSNumberFormatter.В C ++ я сделал бы одну из двух вещей:

  1. использовать auto (т.е. стек) хранилища для NSNumberFormatter
  2. использовать RAII (например, shared_ptr) для управленияжизнь NSNumberFormatter

В Objective-C ни один из этих вариантов не представляется возможным.Я пробовал в стеке:

NSNumberFormatter fmt;

Но это не компилируется.Насколько я могу найти, в Objective-C нет прямого эквивалента RAII.Я, вероятно, смотрю на проблему под неправильным углом зрения, как программиста на C ++, поэтому:

  1. В общем случае, каков правильный, идиоматический (современный) способ Objective-C для обработки жизниобъекты вроде NSNumberFormatter здесь?Неужели мне действительно нужно делать это самому?
  2. В конкретном случае есть ли лучший способ решения актуальной проблемы?

1 Ответ

5 голосов
/ 13 октября 2011

Большинство классов, таких как NSString , NSArray и т. Д., Имеют удобные конструкторы, такие как [NSString string] и [NSArray array], которые возвращают автоматически освобожденные объекты. NSNumberFormatter не имеет удобных конструкторов. Таким образом, вы можете отправить сообщение autorelease, чтобы оно автоматически высвобождалось при сливе пула автоматического выпуска.

NSNumber *theBalance = [[[[NSNumberFormatter alloc] init] autorelease]
                       numberFromString: [textField text]];

Если вы хотите сохранить (владеть) ссылку на объект, вы можете опустить autorelease и отпустить его позже, когда закончите с ним. Вы делаете это так,

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSNumber *theBalance = [numberFormatter numberFromString: [textField text]];

// Later... somewhere in your code...
[numberFormatter release];

Я знаю, что вышеизложенное не является подробным объяснением. Я бы посоветовал вам прочитать этот пост , с помощью которого, я надеюсь, вы получите четкое представление об управлении памятью!

...