2012-06-11 135 views
1

我使用simpleFTP來請求文檔信息。我檢測內存泄漏與儀器如下:simpleftp中的內存泄露

enter image description here

而在調用樹我發現是內存泄漏發生的地點:

enter image description here

的方法「_parseListData」,如下圖:

- (void)_parseListData 
{ 
    NSMutableArray * newEntries; 
    NSUInteger   offset; 

    // We accumulate the new entries into an array to avoid a) adding items to the 
    // table one-by-one, and b) repeatedly shuffling the listData buffer around. 

    newEntries = [NSMutableArray array]; 
    assert(newEntries != nil); 

    offset = 0; 
    do { 
     CFIndex   bytesConsumed; 
     CFDictionaryRef thisEntry; 

     thisEntry = NULL; 

     assert(offset <= self.listData.length); 
     bytesConsumed = CFFTPCreateParsedResourceListing(NULL, &((const uint8_t *) self.listData.bytes) [offset], self.listData.length - offset, &thisEntry); 
     if (bytesConsumed > 0) { 
........ 
} 

我不知道如何解決這個問題。

方法「CFFTPCreateParsedResourceListing」是一個系統方法,它創建__NSDate看看第二個圖片)。

這是發生內存泄漏的地方。

回答

0

CFFTPCreateParsedResourceListing函數返回一個CFDictionarythisEntry變量,該變量可能包含NSDate對象。

代碼應該呼籲thisEntryCFRelease一旦完成它:

// once we're done with thisEntry 
if (thisEntry) { 
    CFRelease(thisEntry); 
} 
+0

此代碼已被列入該功能爲:如果(thisEntry!= NULL){ CFRelease(thisEntry); }我只是繞過它而已 – itenyh

0

舊的職位,但有用的解決方案。你可以在這裏找到答案BlackRaccoon ftp client。 根據創建者CFFTPCreateParsedResourceListing方法保留NSDate的兩倍,以覆蓋問題添加下一個代碼,請注意這裏的意見: FAQ section 「實際上,在WhiteRaccoon中,如果列出一個目錄,您將泄漏NSDate。 CFFTPCreateParsedResourceListing在Apple的SDK中有一個漏洞,我試圖「修補」這個,但是它不能保證工作,對於OS 5.1它確實有效。

  ........ 
      if (parsedBytes > 0) 
      { 
       if (listingEntity != NULL) 
       { 
        //----- July 10, 2012: CFFTPCreateParsedResourceListing had a bug that had the date over retained 
        //----- in order to fix this, we release it once. However, just as a precaution, we check to see what 
        //----- the retain count might be (this isn't guaranteed to work). 
        id date = [(__bridge NSDictionary *) listingEntity objectForKey: (id) kCFFTPResourceModDate]; 
        if (CFGetRetainCount((__bridge CFTypeRef) date) >= 2) 
         CFRelease((__bridge CFTypeRef) date); 

這對我的作品

+0

(嘆氣)是的,這是我爲了解決泄漏而寫的一個討厭的,討厭的,黑客攻擊。它似乎適用於iOS 5和iOS 6.我不能說它是否適用於iOS 7。 –