Получение Памяти Предупреждение Уровень 2, используя представление наложения с MapKit - PullRequest
3 голосов
/ 17 июня 2011

У меня проблема с предупреждениями о памяти на iPhone. Я удаляю оверлеи и вставляю новые. Это происходит каждые 5 секунд. Но через некоторое время, например, через полминуты, я получаю предупреждение памяти и мое приложение вылетает.

Что я мог поделать, проблема с моим оверлеем ...
Треугольник будет создан с помощью «drawRect».
Я проверил это, без треугольника это не было бы проблемой, и приложение работает стабильно.

Но только когда я добавляю треугольник к circleView.

Когда класс треугольника пуст, возникает та же проблема.

- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay
{       
    MKOverlayView *overlayReturn = nil;

    if ([overlay isKindOfClass:[MKCircle class]] == YES) {
    MKCircleView *circleView = [[[MKCircleView alloc] initWithOverlay:overlay]autorelease] ; 

    circleView.strokeColor = [UIColor redColor]; 
    circleView.lineWidth = 1;
    circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4];

   Triangle* triangle = [[Triangle alloc]initWithFrame:CGRectMake(circleView.circle.radius*10-1000, circleView.circle.radius*10-1000, 2000, 2000)];

    triangle.backgroundColor = [UIColor clearColor];
    [circleView addSubview:triangle];
    [triangle release];

    return circleView;
}

Ответы [ 3 ]

1 голос
/ 17 июня 2011

Начните с Утечек и Распределения Инструмента, чтобы видеть, что занимает вашу память. Вы, наверное, что-то пропускаете внутри класса Triangle, если бы мне пришлось угадывать.

1 голос
/ 06 июля 2013

У меня была почти такая же проблема. Просто кажется, что комплект не так хорошо справляется с несколькими оверлеями. Неважно, если это MKCircle, MKPolygon или обычай ...

Проблема в том, что viewForOverlay не использует ваши оверлеи. Поэтому каждый раз создаем новый оверлей и треугольник.

В ответе на этот вопрос описан обходной путь. Хотя это на форумах разработчиков Apple: получите здесь ...

Таким образом, вы создадите один оверлей со всеми вашими оверлеями. Это приводит к гораздо меньшему использованию памяти.

0 голосов
/ 17 июня 2011

Я не уверен, как вы используете этот метод (в цикле или как), но, если вы можете, настройте другой NSAutoreleasepool, чтобы освободить эти объекты, как только вы сможете.

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

for (NSInteger i = 0; i < 99999999999999; i++ )
{
    NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];
    NSString *string = [NSString string];
    // code
    [innerPool release];
}
...