分配并存储到'annot'中的对象的潜在泄漏

时间:2012-02-15 01:38:13

标签: ios cocoa-touch memory-leaks mapkit

我有很多这样的注释(约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 个答案:

答案 0 :(得分:1)

如果您不使用ARC,则应在将对象添加到mapview后释放该对象。

例如:

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.如果将对象添加到数组或字典,则引用计数会递增。因此,在下面的代码块之后,您的引用计数为2。

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

现在,如果在将其添加到mapview后调用annot1上的release,则该对象尚未真正发布。这是因为mapview中的数据结构保留了对它的引用。

[mapView addAnnotation:annot1]

一旦你完成了mapview并且它被释放,那么annot1最终会被破坏。