Мы выпускаем аргумент в быстром перечислении
Мы выпускаем аргумент в быстром перечислении? Поэтому этот код будет точным:
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle];
[circle release]; // Is it perfectly alright to call this?
}
Мне просто интересно, я впервые работаю с быстрым перечислением!
3 ответа
Ответ в правилах управления памятью Apple.
У вас есть любой объект, который вы создаете
Вы создаете объект, используя метод, имя которого начинается с "alloc", "new", "copy" или "mutableCopy"
Вы создали circle
? Нет.
Вы можете вступить во владение объектом, используя сохранить
Вы сохранили circle
? Нет.
Таким образом, вы не являетесь владельцем объекта.
Вы не должны отказываться от владения объектом, который вам не принадлежит
Это кажется довольно прямым, теперь, когда вы определили, что вы не являетесь владельцем circle
, Релиз в примере кода в вашем вопросе не должен быть там. На самом деле, скорее всего, это вызовет сбой где-нибудь в будущем.
Я не думаю, что это правильно. Это также не делает retain
ни release
к примеру
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle]; //retain here
}
addOverley: следует сохранить circle
и это ответственность MapView для release
когда mapView не нужен
Простое руководство, вы retain
это и release
это когда вы сделали это
Быстрое перечисление обычно не создает новые объекты, оно проходит через существующие. Вот почему это почти никогда не правильно: быстрое перечисление обычных контейнеров (NSArray
, NSSet
, NSDictionary
) не сохраняет объекты перед тем, как сделать их доступными для цикла, поэтому освобождение их будет ошибкой. Даже внутри dealloc
Метод, который вы не должны делать: освобождение контейнера освобождает и его элементы, поэтому вы не должны выпускать их по отдельности.