Является ли AutoRelease избыточным при использовании ARC в Objective-C? - PullRequest
1 голос
/ 17 марта 2012

Как вы уже поняли, я довольно новичок в Objective-C, и до недавнего времени я не совсем понимал необходимость всей этой маразмы AutoRelease. Я думаю, что это в основном потому, что я начал Objective-C с ARC, и не имел никакого отношения к сохранению и выпуску.

В любом случае, теперь я понимаю, что до ARC, если вы создали объект и вам нужно было возвращать указатель на него как на возвращаемый объект метода / функции, вам нужно было бы автоматически его высвобождать, потому что вы не можете сделать «[obj release]» после выполнения «return obj;»

Беспокойство об удержаниях и выпусках не является проблемой для ARC. Означает ли это, что в нашем собственном коде действительно есть смысл создавать наши собственные автоматически выпущенные объекты? То есть, вы делаете [[[Class alloc] init] autorelease]? Исходя из того, что я понял, мы все равно должны настраивать пулы с автоматическим выпуском, но только потому, что другие фреймворки или библиотеки могут по-прежнему возвращать объекты с автоматическим выпуском, но нам больше не нужно самим создавать объекты с автоматическим выпуском - это справедливое понимание?

Спасибо, Ник

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

При использовании ARC вы не хотите самостоятельно управлять памятью.В частности, вы не будете вызывать релиз и авто-релиз, потому что он делает все это за вас.Фактически, компилятор, вероятно, должен жаловаться, если вы пытаетесь управлять памятью самостоятельно.

Вместо [[[Class alloc] init] autorelease]; вы просто позвоните [[Class alloc] init];

Я рекомендую прочитать это сообщение для некоторых действительно хороших знаний об ARC и управлении памятью в целом.

0 голосов
/ 17 марта 2012

Ну, ваше понимание совершенно верно. С ARC мы больше не выпускаем и не выпускаем автоматически. Просто убедитесь, что мы присваиваем nil (или другое разумное значение) любой ссылке на объекты, которая нам больше не нужна. В худшем случае мы все еще могли бы постоянно потреблять дополнительную память, но память не может пропускать руду.

И да, мы по-прежнему поддерживаем пулы автоматического выпуска для использования библиотек фреймворков (связанных), которые могут не использовать ARC.

Чтобы ответить на ваш вопрос между строк о цели авто-выпуска. Конечно, это относится только к не-ARC проектам. В старые добрые времена Objective-C не предлагал подсчета ссылок, но сохранял подсчет. Любая выделенная память объектов, которые не сохранены (или имеют счет сохранения 0), считается свободной и может вскоре потребоваться и использоваться другими объектами. Это означает, что каждый объект должен быть сохранен после его размещения, при условии, что вы хотите сохранить его. Когда объект больше не используется, вам нужно освободить его. Это связано с двумя рисками. Что ж, alloc сохраняет его один раз автоматически. 1) Вы можете забыть освободить объект, который не используется. В худшем случае вы можете даже потерять все ссылки на объект, который с тех пор остается в памяти. 2) Вы все еще можете сослаться на объект, который уже был освобожден, и затем попытаться получить к нему доступ, что, скорее всего, закончится исключением BAD_EXC.

Все это может быть довольно раздражающим. Для того, чтобы избавиться от некоторых из этих обязательств для объектов, которые не остаются вокруг очень долго, был изобретен авторелиз. Только для временных объектов вы размещаете его (release-count = 1) и автоматически выпускаете его. Это означает, что объект будет автоматически освобожден (количество участников уменьшится на 1) в следующем круге автоматического выпуска. Но объект остается выделенным для вашего метода, пока он выполняется. Обычно ссылочная переменная будет локальной.

Образец:

-(void) myMethod{

AClass *someObject = [[[AClass alloc] init] autorelease];

// use the object

// probably hand it to another object if that takes ownership, i.e. add it ot an Array using addObject:

// don't care any more

}

И это больше не требуется при использовании ARC.

...