2010-12-29 5 views
2

Я только что начал заниматься разработкой iPhone и пытаюсь разглядеть управление памятью. Я сделал небольшую программу, которая отображает карту и аннотацию на карте. Для аннотации я сделал простой класс, который реализует протокол MKAnnotation.Освободить объект без указателя?

Чтобы создать и добавить аннотацию, я написал это:

[self.myMapView addAnnotation:[[MyAnnotation alloc] init]]; 

Он работал хорошо, пока я не попытался освободить объект. Нечего отпускать. Это то, что я бы сделал в C#, я думаю, что это не работает без сбора мусора?

Так это единственный способ сделать это?

MyAnnotation *myAnnotation = [[MyAnnotation alloc] init]; 

[self.myMapView addAnnotation: myAnnotation]; 

[myAnnotation release]; 

ответ

8
[self.myMapView addAnnotation:[[[MyAnnotation alloc] init] autorelease]]; 
+0

Извините, что я опаздываю. Я все еще борюсь с этим, и ваш ответ - тот, за которым я иду. Мне удалось опубликовать этот вопрос еще раз, на этот раз сосредоточив внимание на утечке памяти, получил тот же ответ, что и ваш. –

1

Да, это общепринятый способ справиться с ситуацией, как это. Вы могли бы также назвать autorelease, как и в ответе codelark, но в ограниченной среде памяти iPhone, автореализация может иногда вызывать проблемы из-за того, что объекты остаются на некоторое время, прежде чем они окончательно выпущены. Хорошая практика - избегать авторефератов, где это возможно.

+1

«Это хорошая практика, чтобы избежать авторегистрации там, где это возможно» - я не согласен. Этого можно избежать, когда вы одновременно выделяете сотни или тысячи объектов. В этом случае это правильная идиома. –

+1

+1 для правильного ответа (пример # 2 - это то, как это обычно делается), но избегать авторекламы без причины - это просто программирование в отношении грузов. В этом случае объект уже сохраняется объектом, который останется в памяти за прошлым циклом события, поэтому избегание автосохранения сохранит абсолютно * не * память. – Chuck

+0

Критика отмечена и оценена. Я запомню, что в будущем буду лучше оценивать свои заявления по этому вопросу. – Endemic

0

Все, спасибо за ответы.

Мне кажется, что этот код наиболее похож на решение, о котором я думал в первую очередь.

[self.myMapView addAnnotation:[[[MyAnnotation alloc] init] autorelease]]; 
Смежные вопросы