Очередная утечка памяти при использовании NSMutableArray - PullRequest
0 голосов
/ 03 января 2012

Я предоставил больше информации о коде.checkstatusthread() вызывается через каждые 5 секунд.Используемый ниже объект ipItemsArray хранит XML, поступающий с сервера.

// XMLAppDelegate.h

@interface XMLAppDelegate : NSObject <UIApplicationDelegate> {
    NSMutableString *hostStr2;
    NSData *dataURL2;
    NSString *playlistdata;

}

@property (nonatomic, retain) NSMutableString *hostStr2;
@property (nonatomic, retain) NSData *dataURL2;
@property (nonatomic, retain) NSString *playlistdata;
@end

// XMLAppDelegate.m

-(void)checkstatusthread
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    hostStr2 = [[NSMutableString alloc] initWithFormat:@"http://%@/getplaylist.php?ip=%@",yourip,restip];

    dataURL2 = [NSData dataWithContentsOfURL: [ NSURL URLWithString: hostStr2 ]];  

    playlistdata = [[NSString alloc] initWithData:dataURL2 encoding: NSASCIIStringEncoding];

    ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"];

    [hostStr2 release]; 
    [playlistdata release];

    status =[ipItemsArray objectAtIndex:0];
    [status retain];

     if([[ipItemsArray objectAtIndex:0]isEqualToString:@"0001"])
     { 
        serverOutput1 =[ipItemsArray objectAtIndex:1];
        [serverOutput1 retain];

        nowplaying =[ipItemsArray objectAtIndex:2];    
        [nowplaying retain];

        tracklocation=[ipItemsArray objectAtIndex:3];
        [requestlocation retain];

        requestlocation=[ipItemsArray objectAtIndex:4];
        temp_app =[tracklocation intValue];


     }

        [serverOutput1 retain];
        [nowplaying retain];
        [serverOutput1 retain];
        [nowplaying retain];
        [tracklocation retain]; 
        [requestlocation retain];

        // checkstatus() called
        [self performSelectorOnMainThread:@selector(checkstatus) 
                           withObject:nil 
                        waitUntilDone:false];

    [pool drain];
}


- (void)dealloc {
    [dataURL2 release];
    [playlistdata release];
    [ipItemsArray release];
}

Строка NSArray *ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"]; дает мне утечку памятикогда я запускаю инструмент утечки в Xcode 4.2.перепробовал все возможные вещи по этому поводу, но чувствую, что нужно что-то добавить.Может кто-нибудь, пожалуйста, помогите мне.

Вот скриншот утечки объекта.Также я заметил, что мое приложение не вызывает метод Dealloc.

enter image description here

Ответы [ 3 ]

1 голос
/ 03 января 2012

На самом деле Анализатор указывает вам на эту строку кода:

NSMutableString *hostStr2 = [[NSMutableString alloc] initWithFormat:@"http://   %@/getplaylist.php?ip=%@",yourip,restip];

, которую вы выделили и еще не выпустили.

Вам необходимо освободить ее.

1 голос
/ 05 января 2012

Протекающий объект - это «статус».Я делаю вывод, что это iVar.Когда вы делаете это:

 status =[ipItemsArray objectAtIndex:0];
[status retain];

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

if(status) {
    [status release];
}
status =[ipItemsArray objectAtIndex:0];
[status retain];

Это решит проблему утечки, показанную на приборах.(Предполагая, что ARC не используется)

0 голосов
/ 03 января 2012

Все, что вы сделали, правильно.Не каждая утечка, показанная Leaks Instrument, в настоящее время является утечкой.

Я рекомендую на первом этапе использовать Clang Analyzer XCode -> Продукты -> Анализ.Это показывает вам некоторые потенциальные утечки.И после этого вы должны использовать Heapshot Analysis http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

...