Авто-релиз для начинающих - PullRequest
2 голосов
/ 02 мая 2011

Я нашел это очень полезное определение здесь :

Когда вы выполняете автоматический выпуск, вы в основном говорите: «Мне это больше не нужно, но кто-то ещеможете забрать его (до того, как пул автоматического выпуска будет слит) ​​".Когда вы явно ссылаетесь на объект, который вы говорите: «Мне это больше не нужно, и если кто-то еще не сказал иначе (приобрел), он должен быть немедленно освобожден».

Следовательно, авто-релиз не являетсяобычно неправильно.Это необходимо, когда вы хотите передать объекты обратно отправителю сообщения, не требуя от отправителя позаботиться об освобождении объекта.

Однако мне все еще интересно, что означает второй абзац.Авто-релиз, как правило, не то, что нужно делать ... Я думал, что это действительно интенсивно использует память, поэтому, естественно, это не то, что нужно делать.Но, что касается последнего предложения, я боюсь, что я не понимаю.

Когда мне действительно нужно использовать autorelease и какой будет хороший пример / практическое правило, которое новички могут легко запомнить?

Спасибо за любые предложения.

Ответы [ 4 ]

3 голосов
/ 02 мая 2011

Авто-релиз обычно не неправильный что нужно сделать ... я думал, что это действительно память интенсивная, поэтому следует естественно, неправильно поступить.

Это совсем не «интенсивная память». Если вы выделите и автоматически освободите очень большое количество объектов, например, в цикле, или меньшее количество больших объектов, вы можете столкнуться с проблемами. Но автоматическое освобождение просто задерживает освобождение объектов, которые вы в любом случае создаете, и которые могут или не могут даже быть освобождены, когда освобождение действительно происходит (объекты с автоматическим освобождением могут также сохраняться другими объектами).

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

Но что касается последнего предложения, боюсь, я его не понимаю.

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

1 голос
/ 03 мая 2011

Имейте в виду, что если вы используете такие методы, как NSString stringWithFormat NSArray arrayWithObjects, то вы уже получаете и используете автоматически выпущенные объекты. Просто следуйте поведению системы и не усложняйте ситуацию, пока инструменты или другие данные производительности не скажут вам обратное.

1 голос
/ 02 мая 2011

Стоит также отметить, что методы с префиксом «alloc», «new», «copy» или «mutableCopy» (например, alloc, newObject или mutableCopy) возвращают сохраненный объект(вам нужно освободить его, когда вы закончите с ним), тогда как другие методы возвращают автоматически освобожденные объекты (вам не нужно освобождать их, но вам нужно сохранить их, если вы хотите сохранить их).Это соглашение Apple, и вы должны следовать ему при реализации собственных классов.

1 голос
/ 02 мая 2011

Например, когда у вас есть класс, у которого есть какой-то случайный метод, который называется так:

- (NSString *)roflString { return [NSString stringWithString:@"ROFL!!!"]; }

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

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

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