Мы выпускаем аргумент в быстром перечислении

Мы выпускаем аргумент в быстром перечислении? Поэтому этот код будет точным:

    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 Метод, который вы не должны делать: освобождение контейнера освобождает и его элементы, поэтому вы не должны выпускать их по отдельности.

Другие вопросы по тегам