MKMapView removeAnnotations вызвать утечку памяти - PullRequest
0 голосов
/ 31 января 2011

все! Я проверил этот самый простой код следующим образом:

StorePin.h

#import <Foundation/Foundation.h>  
#import <MAPKIT/mapkit.h>   
#import <CORELOCATION/corelocation.h> 


@interface StorePin : NSObject <MKAnnotation> {   

    CLLocationCoordinate2D coordinate;
    NSString *subtitle;   
    NSString *title;   
}   

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

-(id) initWithCoords:(CLLocationCoordinate2D) coords;   

@end

StorePin.m

#import "StorePin.h"


@implementation StorePin

@synthesize coordinate, subtitle, title;   

- (id) initWithCoords:(CLLocationCoordinate2D) coords{   

    self = [super init];   

    if (self != nil) {   

        coordinate = coords;    

    }   

    return self;   

}   

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

@end 

В моем ViewControlller я сделал кнопку для повторного добавления и удаления комментариев.

#import "mapViewTestViewController.h"
#import "StorePin.h"

@implementation mapViewTestViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}


- (IBAction)refresh
{
    [mapView removeAnnotations:mapView.annotations];

    for (int i = 0; i < 101; i ++)
    {
        CLLocationCoordinate2D p1;

        p1.latitude = i/10.0;   
        p1.longitude = i/10.0;  

        StorePin *poi = [[StorePin alloc] initWithCoords:p1]; 
        [mapView addAnnotation:poi];

        [poi release]; 
    }
}


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

@end

Если я добавляю и удаляю аннотации менее 100 раз, все работает нормально. Но если я выполню цикл более 100 раз, это приведет к утечке памяти один раз. Я почти без ума от этой странной проблемы. Это ошибка моего кода или ошибка mkmapview? Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вы не говорите, какие объекты были обнаружены как утечка, но если они StorePin s, то это проблема MapKit - ваш код управления памятью для StorePin s, который вы создаете в цикле, просто в порядке.

Одна вещь, которую вы делаете, что может вызывать проблемы MapKit, это передача представлению карты ссылки на свой собственный ивар, который вы хотите изменить.Это не кажется слишком вероятным - если бы это была действительно проблема, это, вероятно, вызвало бы сбой, а не утечку.Тем не менее, вы можете попытаться сделать копию, либо мелкую (как Кай писал ранее, но абсолютно делайте не следуйте советам по использованию сохранения количества и вызову release в цикле):

NSArray * annotationsCopy = [NSArray arrayWithArray:mapView.annotations];

или глубокий:

NSArray * annotationsDeepCopy = [[[NSArray alloc] initWithArray:mapView.annotations 
                                                      copyItems:YES] 
                                            autorelease];

, затем передайте копию в removeAnnotations:.

Второй вариант создает автоматически выпущенный массив с копией каждого элемента всписок аннотаций, чтобы представление карты не пыталось удалить те же экземпляры, что итерируется.Очевидно, что это использует в два раза больше памяти;Вы, вероятно, хотите беспокоиться об этом только для поиска ошибок.

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

0 голосов
/ 04 мая 2012

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

 NSArray * annotationsCopy = [NSArray arrayWithArray:[mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]]];
...