Может кто-нибудь указать мне на утечку в этом коде? - PullRequest
1 голос
/ 17 января 2011

DisplayMap.h

#import <Foundation/Foundation.h>
#import <MapKit/MKAnnotation.h>


@interface DisplayMap : NSObject <MKAnnotation> {

    CLLocationCoordinate2D coordinate; 
    NSString *title; 
    NSString *subtitle;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property (nonatomic, copy) NSString *title; 
@property (nonatomic, copy) NSString *subtitle;

@end

DisplayMap.m

#import "DisplayMap.h"


@implementation DisplayMap

@synthesize coordinate,title,subtitle;


-(void)dealloc{
    [title release];
    [super dealloc];
}

@end

Я реализую вышеупомянутое в представлении карты, чтобы показать аннотации. На viewdidload я запускаю набор координат и отображаю их на карте, используя вышеупомянутый класс аннотаций.

for(int i=0;i<[xmlParameter count];i++){
    region.center.latitude=(double)[[[xmlParameter objectAtIndex:i]objectAtIndex:3] doubleValue];
    region.center.longitude =(double) [[[xmlParameter objectAtIndex:i]objectAtIndex:4] doubleValue] ;
    region.span.longitudeDelta = 0.08f;
    region.span.latitudeDelta = 0.08f;
    DisplayMap *ann = [[DisplayMap alloc] init]; 
    ann.title = [[xmlParameter objectAtIndex:i]objectAtIndex:0];
    ann.subtitle = [[xmlParameter objectAtIndex:i]objectAtIndex:1]; 
    ann.coordinate = region.center; 
    [mapView addAnnotation:ann];
    if(i==zoomtoParameter){
        [mapView setRegion:region animated:YES];            
        //showAnnotation=ann;       
        [mapView selectAnnotation:currentAnnotation animated:YES];          
        //[mapView selectAnnotation:ann animated:YES];
    }

    [ann release];
}   

Работа с инструментами с утечками говорит о том, что в методе viewDidLoad есть утечка DisplayMap для 32 байт. Я не могу понять, как; я освобождаю объект DisplayMap сразу после того, как с ним покончено.

Есть предложения?

Спасибо

1 Ответ

4 голосов
/ 17 января 2011

Ваше свойство subtitle объявлено с атрибутом copy, что означает, что вы несете ответственность за его освобождение.Следующее изменение вашего dealloc метода должно сработать:

-(void)dealloc{
    [subtitle release];
    [title release];
    [super dealloc];
}

Редактировать: Чтобы уточнить: Какао управления памятью правилазаявите, что вы должны release любую память, которую вы alloc, retain или copy.В случае синтезированных свойств это означает, что вы должны включить соответствующие release сообщения в ваш метод -dealloc.См. Мой вопрос по этой теме для получения дополнительной информации.

В приведенном вами примере кода следующая строка:

ann.subtitle = [[xmlParameter objectAtIndex:i]objectAtIndex:1];

Создает копию указанногообъект.При последующем вызове [ann release] этот скопированный объект будет пропущен, если вы явно не освободите его.

...