1

Мне было интересно, могу ли я напрямую назначить, инициализировать ivar сейчас с помощью ARC (потому что, если я хорошо помню, это было невозможно без ARC, потому что это пропустило бы память нет) ?Objective-C - назначение/инициализация объекта с ARC

Пример (рассмотрит Ивар объявленный как это):

@property (nonatomic, strong) NSArray *myArray; 

@synthetize myArray = _myArray; 

А потом сделать

self.myArray = [[NSArray alloc] initWithObjects:object1, object2, nil]; //I know I could directly use [NSArray arrayWithObjects:...] but that's the purpose of my question 

ответ

3

Да.

Единственная разница между использованием alloc/initWithObjects: и arrayWithObjects: заключается в том, что первое оставляет вас с сохраненным объектом, а второй - нет. Если по какой-то причине вы хотели использовать первую для инициализации свойства, вы должны добавить звонок в autorelease, чтобы избежать утечки. Так что вы могли бы сделать это:

self.myArray = [[[NSArray alloc] initWithObjects:foo, bar, nil] autorelease]; 

Вы правы, что с ARC, компилятор будет заботиться о добавив, что для вас, так что теперь вы можете просто сказать:

self.myArray = [[NSArray alloc] initWithObjects:foo, bar, nil]; 
0

было бы, если бы вы не выпускали его на методе dealloc. С ARC вы несете ответственность за распределение. В методе dealloc, используя ARC, вы все равно можете освобождать ресурсы, используя self.ivar=nil (но ARC уже делает это автоматически для вас), но не используя слово release явно. Кроме того, ARC не позволяет вам звонить [super dealloc].

-1

Вы можете по-прежнему распределять и сохранять. Жизненный цикл объекта остается тем же, т. Е. Объекты получают выпуск, когда число повторов уменьшается до 0. Все, что ARC делает для вас, помещает объекты в пул автозапуска и правильно выпускает его, где вы должны были это сделать. Вы все же можете переопределить dealloc.

Вы можете найти хорошую статью о ARC here

+1

Это неправильно. Разумеется, вы можете использовать 'alloc' в коде ARC, но не' keep', 'release' или' autorelease'. Кроме того, ARC делает больше, чем просто вкладывает все в пул автономии; он анализирует ваш код для определения времени жизни каждой ссылки и вставляет соответствующие вызовы методам управления памятью. – Caleb

+0

согласны с тем, что сохранение не может быть использовано, но я упомянул, что жизненный цикл остается тем же. прочитайте 2-й и 3-й строки – zahreelay

+0

Да, но вы сначала написали: «Вы все еще можете выделить и сохранить». Прочитайте 1-ю строку. И, как я уже сказал, предложение, начинающееся «Все, что делает ARC ...», в лучшем случае вводит в заблуждение. – Caleb

Смежные вопросы