MKAnnotationView: утечка памяти - PullRequest
       6

MKAnnotationView: утечка памяти

0 голосов
/ 18 августа 2011

Я использую следующий код, чтобы сделать вывод для аннотации:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)           annotation
{
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);

    return annView;
}

Все работает отлично, однако Analyze в XCode показывает утечку памяти в этом коде.На самом деле, я вижу это слишком, потому что я выделил объект, а затем не выпустил его.Как я могу избежать утечки памяти здесь?

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

Вы не написали, но я думаю, что анализатор скажет вам, что здесь просачивается:

MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] 
                                 initWithAnnotation:annotation 
                                    reuseIdentifier:@"currentloc"];

Это потому, что вам необходим элемент автоматического выпуска:

MKPinAnnotationView *annView=[[[MKPinAnnotationView alloc] 
                                  initWithAnnotation:annotation 
                                     reuseIdentifier:@"currentloc"] autorelease];

ОБНОВЛЕНИЕ1008 *

Также вы не можете повторно использовать созданные аннотации, попробуйте сделать это:

MKPinAnnotationView *annView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"currentloc"];
if(annView == nil) 
    annView = annView=[[[MKPinAnnotationView alloc] 
                         initWithAnnotation:annotation 
                            reuseIdentifier:@"currentloc"] autorelease];
1 голос
/ 18 августа 2011

На самом деле, я вижу это слишком, потому что я выделил объект, а затем не выпустил его.

Вы правы по поводу причины утечки. Если вам нужно вернуть выделенный объект из метода, то идея состоит в том, чтобы автоматически выпустить это.

- (MyClass *)getObject {
    MyClass *obj = [[MyClass alloc] init];
    return [obj autorelease];
}

Тогда при необходимости вы сохраните возвращенный объект в вызывающей стороне.

Или назовите метод таким образом, чтобы было ясно, что возвращаемый объект должен быть освобожден в вызывающей программе. А потом отпустите в звонилке.

...