2012-01-03 26 views
0

我已經提供了有關代碼的更多信息。每5秒後調用一次checkstatusthread()ipItemsArray下面使用的對象存儲來自服務器的XML。使用NSMutableArray的另一個內存泄漏

// 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

+1

當你完成時你是否發佈了playlistdata和hostStr2? – 2012-01-03 10:56:19

+0

@ ShantiK:是的。 – maddy2012 2012-01-04 12:37:09

+0

你爲什麼保留兩次狀態? – 2012-01-05 05:36:33

回答

1

泄漏的對象是「狀態」。我推斷它是一個iVar。當您這樣做時:

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

這些行第二次執行時,先前存儲的狀態值無法正確釋放,因此泄漏。你應該這樣做:

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

這將解決你的儀器泄漏問題。 (假設ARC沒有被使用)

+0

對其他iVars也一樣。否則使用保留屬性並使用self.status訪問它們,等等。在這種情況下,您可以直接分配,而不必釋放先前的值 – 2012-01-05 06:11:01

0

所有你所做的是正確的。泄漏儀表顯示的泄漏現在不是泄漏。

我建議您在第一步使用Clang Analyzer XCode - > Products - > Analyze。這顯示你一些潛在的泄漏。而在這之後,你應該使用Heapshot分析http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

+0

謝謝。分析顯示我沒有問題。我會嘗試這裏給出的鏈接並使用此方法並返回。 – maddy2012 2012-01-03 12:28:43

+0

通過使用分配工具,Mark Heap分析再次指向該代碼行。 'NSArray * ipItemsArray = [playlistdata componentsSeparatedByString:@「|^|」];' – maddy2012 2012-01-04 06:23:20

1

實際上分析儀指着你到這行代碼:

您已分配但尚未釋放
NSMutableString *hostStr2 = [[NSMutableString alloc] initWithFormat:@"http:// %@/getplaylist.php?ip=%@",yourip,restip]; 

你需要釋放它。

+0

playlistdata也未被釋放。 – WiseOldDuck 2012-01-03 10:59:50

+0

'playlistdata'是課堂級別,所以這就是我沒有指出的原因。 – 2012-01-03 11:04:51

+0

我釋放所有三個對象。但它仍然表現出內存泄漏。我是否需要使用其他類或其他解決方案? – maddy2012 2012-01-03 11:54:34