2010-03-13 72 views
10

運行儀器,我間歇招致恰好3.5 KB在CFNetwork的的存儲器泄漏,負責的幀是「HostLookup_Master :: HostLookup ....」CFNetwork的/ NSURLConnection的泄漏裝置上

我已閱讀了一些問題再這個問題,並已分別嘗試了以下修理泄漏:

  1. 包括以下內容中的applicationDidFinishLaunching:

    NSURLCache * sharedCache = [[NSURLCache頁頭] initWithMemoryCapacity:0 diskCapacity:0 diskPath:零]; [NSURLCache setSharedURLCache:sharedCache]; [sharedCache release];

  2. 在urlrequest中指定不從本地緩存加載。

以上都沒有奏效。實例化連接的類不泄漏,因爲它的實例在下載數據時被釋放。我已通過使用工具確認該類的活動對象爲0來驗證此事。

任何意見,解決這個泄漏將不勝感激。

+2

從技術上講,如果主機查找被緩存,它不是泄漏,因爲它仍然被引用並且可以被重用。我的意思是,緩存代碼中可能會有泄漏,它永遠不會釋放它。如果這確實是泄漏,那麼請向Apple發送雷達錯誤報告。 – lucius 2010-04-27 17:16:30

+0

NSURLConnection在最好的時候泄漏。多線程時它會泄漏很多。我不會擔心一個小漏洞:應用程序商店的批准。 – sehugg 2010-06-11 16:48:35

回答

1

3.5KB內存泄露聽起來很熟悉,曾與線程打交道時

@implementation MyClass 
+ (void)login 
{ 
    //MyClass *this = [[MyClass alloc] init]; // MEMORY LEAK 
    MyClass *this = [[[MyClass alloc] init] autorelease]; 
    [NSThread detachNewThreadSelector:@selector(anotherThread) 
          toTarget:this 
          withObject:nil]; 
} 

- (void)anotherThread { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self doStuff]; 
    //[self release]; // MEMORY LEAK 
    [pool release]; 
} 
@end 

每次登錄創建3.5KB泄漏。使用autorelease解決了問題

+0

對我來說,它看起來有點尷尬,你爲什麼要做這個任務: MyClass * this = [[[MyClass alloc] init] autorelease]; 「這個」不是你通常在Obj-C中使用的。如果你沒有把它分配給self,這在Obj-C中通常使用,那麼你有可能泄漏內存。我也沒有得到的是,你將「this」聲明爲局部變量。如果您從+(無效)登錄返回,則您超出範圍並且指針丟失。然後你在[self release]中做的事情是消息nil,它工作正常。你然後泄漏「這個」變量。 – GorillaPatch 2010-06-24 07:48:03

+0

@GorillaPatch登錄是一個類方法,而不是一個實例方法,所以沒有「自我」在那裏泄漏。創建的對象恰好被稱爲「this」(一種很差的名稱恕我直言),是當 - (void)另一個線程被調用時的目標,所以它應該在那個時候被釋放。 – Tony 2010-06-25 18:45:54

+1

@託尼,我很困惑的「這個」。對我來說,分離的線程擁有這個對象的所有權是有意義的,然後你可以在產生一個新線程後直接在+ login方法中釋放它。你怎麼看? – GorillaPatch 2010-06-25 21:18:13

1

看來,蘋果可能知道與CFNetwork使用有關的3.5k泄漏,可能是reported as a bug already

+1

在蘋果上發現一個bug有點像犧牲一隻雞。你不確定它是否有幫助,但它肯定不會造成任何傷害。 ;-) – GorillaPatch 2010-06-26 06:47:24

+0

雞對此可能有不同的看法。 – 2012-05-25 09:11:22