2011-11-18 2 views
3

Я пытался избавиться от утечек памяти в mapview. Я использую пользовательский класс контактов карты. Все работает, но проблема в том, что мне нужно отфильтровать результаты поиска. когда я удаляю все аннотации mapview - и добавляю отфильтрованные результаты - инструмент производительности обнаруживает утечки. но в этом классе mapPin я использую autorelease, поэтому они должны быть выпущены, но это не так. Что я делаю не так?удаление/добавление аннотаций к mapview вызывает утечку памяти

MapPin.h

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

@interface MapPin : NSObject<MKAnnotation> { 
    CLLocationCoordinate2D coordinate; 
    NSString * picture; 
    NSInteger tag_number; 
} 

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


- (id) initWithCoordinate:(CLLocationCoordinate2D) coord; 
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title; 
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle; 
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic; 
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic num:(NSInteger) number; 
- (void) setPic:(NSString *) picture; 
- (NSString*) getPic; 

- (void) setNum:(NSInteger) tag_number; 
- (NSInteger) getNum; 

@end 

MapPin.m

#import "MapPin.h" 


@implementation MapPin 

@synthesize coordinate = _coordinate; 
@synthesize title = _title; 
@synthesize subtitle = _subtitle; 


- (id) initWithCoordinate:(CLLocationCoordinate2D) coord 
{ 
    return [self initWithCoordinate:coord title:@""]; 
} 

- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title { 
    return [self initWithCoordinate:coord title:title subtitle:@""]; 

} 
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle { 
    return [self initWithCoordinate:coord title:title subtitle:subtitle image:@""];} 

- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic{ 
    MapPin * me = [[[MapPin alloc] init] autorelease]; 
    me.coordinate = coord; 
    me.title = title; 
    me.subtitle = subtitle; 

    [me setPic:pic]; 

    return me; 
} 

- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic num:(NSInteger) number{ 
    MapPin * me = [[[MapPin alloc] init] autorelease]; 
    me.coordinate = coord; 
    me.title = title; 
    me.subtitle = subtitle; 

    [me setPic:pic]; 
    [me setNum:number]; 
    return me; 
} 

- (void) setPic:(NSString*) pic { 
    picture = pic; 
} 

- (NSString *) getPic{ 
    return picture; 
} 

- (void) setNum:(NSInteger) number { 
    tag_number = number; 

} 

- (NSInteger) getNum{ 
    return tag_number; 
} 

@end 
+1

Я не вижу реализацию метода dealloc. Вы используете ARC? – Denis

+1

нет ARC, только что нашел этот код в Интернете и использовал этот класс с тех пор. только сейчас решили протестировать утечки памяти. – user979250

ответ

2

Я использую Cutom карту булавку, созданную Маюр Birari, который я подправил немного, чтобы поддержка пользовательских изображений карт и идентификаторов.

CustomMapPin.h

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

@interface CustomMapPin : NSObject<MKAnnotation> { 

    CLLocationCoordinate2D coordinate; 
    NSString*    title; 
    NSString*    subtitle; 

    NSString*    pic; 
    NSInteger    tag_number; 

} 

@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property (nonatomic, copy)  NSString*    title; 
@property (nonatomic, copy)  NSString*    subtitle; 
@property (nonatomic, copy)  NSString*    pic; 
@property (nonatomic)   NSInteger    tag_number; 


@end 

CustomMapPin.m

#import "CustomMapPin.h" 


@implementation CustomMapPin 

@synthesize title; 
@synthesize subtitle; 
@synthesize coordinate; 
@synthesize pic; 
@synthesize tag_number; 


- (void)dealloc 
{ 
    self.title = nil; 
    self.pic = nil; 
    self.subtitle = nil; 
    [super dealloc]; 
} 

@end 

и использовать его в классе, как это:

CLLocationCoordinate2D pinlocation; 

в цикле я создал ре значения и quired создать карту булавку:

pinlocation.latitude = ...; 

pinlocation.longitude = ...; 

NSInteger pinID = ....; 


CustomMapPin* customMapPin=[[CustomMapPin alloc] init]; 

customMapPin.coordinate=(CLLocationCoordinate2D 
    {pinlocation.latitude,pinlocation.longitude}; 

[email protected]"title"; 

[email protected]"subtitle"; 

customMapPin.pic = @"customImageName"; 

customMapPin.tag_number = pinId; 


[mapView addAnnotation:customMapPin]; 

Настройка пользовательского образа:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 
{ 
    if ([annotation isKindOfClass: [CustomMapPin class]]) 
    { 
     CustomMapPin * a = annotation; 

     [annView setImage:[UIImage imageNamed:a.pic]]; 
    } 
} 

Getting контактный идентификатор на условном обозначении:

- (void)mapView:(MKMapView *)mp annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    CustomMapPin * v = (CustomMapPin *) view.annotation; 

    int tagNumber = v.tag_number; 

    .... 
} 

и, наконец, - в моем проекте требовалось иметь кнопки фильтров - поэтому мне нужно было удалить все контакты и добавить необходимые. По умолчанию вызов mapview для удаления всех аннотаций, вызванных утечками памяти. Поэтому, когда мне нужно очистить MapView от аннотаций, я называю эту функцию:

- (void)removeAnnotations 
{ 
    NSMutableArray *toRemove = [NSMutableArray arrayWithCapacity:[mapView.annotations count]]; 

    for (id annotation in mapView.annotations) 
    { 
     if (annotation != mapView.userLocation) 
     { 
      [toRemove addObject:annotation]; 
     } 
    } 

    [mapView removeAnnotations:toRemove]; 

    for(int i = 0; i < [toRemove count]; i++) 
    { 
     CustomMapPin * a = [toRemove objectAtIndex:i]; 

     [a release]; 

     a = nil; 
    } 
} 

Надеется, что это помогает Счастливого кодированию! :)

+0

Вы уверены, что сможете сделать [выпуск] после удаления всех аннотаций с карты? Разве это не автоматическое освобождение аннотаций? – AmitP

2

Вы просто пропустили реализацию dealloc!

, например:

- (void)dealloc 
{ 
    [self.title release]; 

    self.title = nil; 

    self.subtitle release]; 

    self.subtitle = nil; 

    [super dealloc]; 
} 
Смежные вопросы