Что произойдет, если я вызову nsobject init более одного раза? Увеличивает ли он сохранение счета? - PullRequest
4 голосов
/ 07 ноября 2011

Я довольно новичок в Objective-C, и у меня много проблем с управлением памятью, и все же я немного понимаю.Если у меня есть объект, например NSArray * myArray, и я делаю это

myArray = [[NSArray alloc] initWithObjects:obj1,obj2,obj3,nil];

, тогда я делаю что-то, и я хочу, чтобы myArray содержал новые объекты, а затем я снова инициирую его

[myArray initWithObjects:obj4,obj5,obj6, nil];

кажется, что он делает то, что мне нужно, но правильно ли это с точки зрения управления памятью?Должен ли я выпустить его дважды тогда?

Ответы [ 3 ]

4 голосов
/ 07 ноября 2011

Это не увеличивает счет удержания.Начальное значение alloc устанавливает количество сохранений равным 1.

При этом никогда не следует вызывать метод init более одного раза для объекта.Хотя ваш пример может сработать, в лучшем случае он, вероятно, утечет из своего внутреннего хранилища и не освободит ваши obj1, obj2 и obj3.В худшем случае он может иметь несовместимое внутреннее состояние и привести к сбою.

Если вы просто делаете это пару раз, вы можете также создать новый массив:

NSArray* myArray = [NSArray arrayWithObjects:obj1, obj2, obj3, nil];
// Do some stuff...
myArray = [NSArray arrayWithObjects:obj4, obj5, obj6, nil];
// Do more stuff

Если вы делаете это много, например, в цикле, вам, вероятно, следует использовать NSMutableArray:

NSMutableArray* myArray = [NSMutableArray array];
for (...) {
  [myArray removeAllObjects];
  [myArray addObject:obj4];
  [myArray addObject:obj5];
  [myArray addObject:obj6];
  // Do stuff
}
4 голосов
/ 07 ноября 2011

Не делай этого!

В общем, если вы хотите сбросить объекты или вещи внутри уже существующего объекта Objective C, создайте и используйте какой-нибудь метод Setter.

Для вашего массива, опять же , не делайте этого ! Метод "initWithObjects", который вы цитируете, удобен для инициализации неизменяемого (неизменяемого) массива элементами, которые будут заполняться массивом в течение всего времени его жизни.

Для того, что вы пытаетесь сделать, просто используйте NSMutableArray. Документация для этого приведена ниже:

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

2 голосов
/ 06 марта 2014

Это старый вопрос.Но я нашел похожий ответ по этой ссылке:

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics-of-init

Маленькая цитата из ссылки:

Неопределенное поведение для программы вызывает дваили более вызовов методов init для одного и того же объекта, за исключением того, что каждый вызов метода init может выполнять не более одного вызова init делегата.

...