потенциальная утечка объекта, выделенного и сохраненного в «annot» - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть много аннотаций (около 2400), но вот моя проблема.

Я получаю следующие ошибки

потенциальная утечка объекта, расположенного в строке 81 и сохраненного в 'Annot1' потенциальная утечка объекта, размещенного в строке 81 и сохраненного в 'annot2'

потенциальная утечка объекта, расположенного в строке 81 и сохраненного в 'Annot3'

И так далее. Вот мой код:

MKPointAnnotation *annot1 = [[MKPointAnnotation alloc] init]; 
annot1.title = @"A"; 
annot1.subtitle=@"A1"; 
annot1.coordinate = CLLocationCoordinate2DMake(21.978954, 120.752663); 
[mapView addAnnotation:annot1]; 
MKPointAnnotation *annot2 = [[MKPointAnnotation alloc] init]; 
annot2.title = @"B"; 
annot2.subtitle=@"B2"; 
annot2.coordinate = CLLocationCoordinate2DMake(21.988607, 120.748703); 
[mapView addAnnotation:annot2]; 

MKPointAnnotation *annot4 = [[MKPointAnnotation alloc] init]; 
annot4.title = @"C"; 
annot4.subtitle=@"C1"; 
annot4.coordinate = CLLocationCoordinate2DMake(22.008867, 120.743637); 
[mapView addAnnotation:annot4]; 
MKPointAnnotation ***strong text**annot5 = [[MKPointAnnotation alloc] init]; 
annot5.title = @"D"; 
annot5.subtitle=@"D1"; 
annot5.coordinate = CLLocationCoordinate2DMake(22.016190, 120.837601); 
[mapView addAnnotation:annot5]; 
MKPointAnnotation *annot6 = [[MKPointAnnotation alloc] init]; 
annot6.title = @"E"; 
annot6.subtitle=@"E1"; 
annot6.coordinate = CLLocationCoordinate2DMake(22.024183, 120.743401); 
[mapView addAnnotation:annot6]; 
MKPointAnnotation *annot7 = [[MKPointAnnotation alloc] init]; 
annot7.title = @"F"; 
annot7.subtitle=@"F1"; 
annot7.coordinate = CLLocationCoordinate2DMake(22.055653, 121.509689); 
[mapView addAnnotation:annot7]; 
MKPointAnnotation *annot8 = [[MKPointAnnotation alloc] init]; 
annot8.title = @"G"; 
annot8.subtitle=@"G2"; 
annot8.coordinate = CLLocationCoordinate2DMake(22.070082, 120.713684); 
[mapView addAnnotation:annot8]; 

и т.д.

{

1 Ответ

1 голос
/ 15 февраля 2012

Если вы не используете ARC, то вы должны освободить объект после добавления его в вид карты.

Например:

MKPointAnnotation *annot1 = [[MKPointAnnotation alloc] init]; 
annot1.title = @"A"; 
annot1.subtitle=@"A1"; 
annot1.coordinate = CLLocationCoordinate2DMake(21.978954, 120.752663); 
[mapView addAnnotation:annot1]; 

Должен быть обновлен до:

MKPointAnnotation *annot1 = [[MKPointAnnotation alloc] init]; 
annot1.title = @"A"; 
annot1.subtitle=@"A1"; 
annot1.coordinate = CLLocationCoordinate2DMake(21.978954, 120.752663); 
[mapView addAnnotation:annot1];
[annot1 release]

Причина в том, что счетчик ссылок на ваш объект никогда не достигнет нуля и объект никогда не будет освобожден.

MKPointAnnotation *annot1 = [[MKPointAnnotation alloc] init];

Когда вы выделяете объект, он имеет счетчик ссылок 1. Если вы добавляете объект в массив или словарь, счетчик ссылок увеличивается. Итак, после следующего блока кода у вас счетчик ссылок равен два.

MKPointAnnotation *annot1 = [[MKPointAnnotation alloc] init]; 
annot1.title = @"A"; 
annot1.subtitle=@"A1"; 
annot1.coordinate = CLLocationCoordinate2DMake(21.978954, 120.752663); 
[mapView addAnnotation:annot1]

Теперь, если вы вызываете release на annot1 после того, как добавляете его в представление карты, объект еще не выпущен. Это потому, что структура данных в вашем картографическом представлении содержит ссылку на него.

[mapView addAnnotation:annot1]

Как только вы закончите с вашим просмотром карты, и он будет выпущен, annot1 будет окончательно уничтожен.

...