簡體   English   中英

為什么我的NSURLResponse存檔時會泄漏內存?

[英]Why is my NSURLResponse leaking memory when archived?

我在我的代碼中發現了一個泄漏,在該泄漏中歸檔和取消歸檔NSURLResponse會導致泄漏,但我不知道為什么。

   - (void)doStuffWithResponse:(NSURLResponse *)response {
        NSMutableData *saveData = [[NSMutableData alloc] init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData];
        [archiver encodeObject:response forKey:@"response"];
        // Encode other objects
        [archiver finishDecoding];
        [archiver release];
        // Write data to disk
        // release, clean up objects
    }

    - (void)retrieveResponseFromPath:(NSString *)path {
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:path]];
        NSURLResponse *response = [unarchiver decodeObjectForKey:@"response"];
        // The above line leaks!!
        // decode other objects
        // clean up memory and do other operations
    }

當我取消存檔NSURLResponse時,儀器報告泄漏。 如果我將其注釋掉並且不使用它,則不會泄漏。 有趣的是,我保存了NSURLResponse的片段,沒有泄漏:

    // Encode:

 [archiver encodeObject:[response URL] forKey:@"URL"];
 [archiver encodeObject:[response MIMEType] forKey:@"MIMEType"];
 [archiver encodeObject:[NSNumber numberWithLongLong:[response expectedContentLength]] forKey:@"expectedContentLength"];
 [archiver encodeObject:[response textEncodingName] forKey:@"textEncodingName"];

    // Decode:

 NSURL *url = [unarchiver decodeObjectForKey:@"URL"];
 NSString *mimeType = [unarchiver decodeObjectForIKey:@"MIMEType"];
 NSNumber *expectedContentLength = [unarchiver decodeObjectForKey:@"expectedContentLength"];
 NSString *textEncodingName = [unarchiver decodeObjectForKey:@"textEncodingName"];

 NSURLResponse* response = [[NSHTTPURLResponse alloc] initWithURL:url MIMEType:mimeType expectedContentLength:[expectedContentLength longLongValue] textEncodingName:textEncodingName];

有人知道為什么嗎? 歸檔NSURLResponse是否存在錯誤,或者我做錯了什么?

Objective-C中的內存管理非常簡單,只要知道每次調用方法名稱中具有“ alloc”,“ new”或“ copy”的東西(或保留它),就必須在某個時候釋放它。點。 請參閱此以獲取更多信息: http : //developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

在您的情況下,您似乎在調用alloc創建一個NSMutableData,但是從不釋放它(因此doStuffWithResponse結尾的[saveData release]:可以解決至少一個泄漏)。 從此代碼中,分配的NSKeyedUnarchiver和分配的NSURLResponse似乎也是如此。

如果您不持有該值,例如在ivar中,也可以在分配后立即調用自動釋放,或者使用該類的自動釋放的創建者(如果可用)(例如[NSString stringWithFormat:]而不是[[NSString alloc] initWithFormat) :])。

選擇構建>構建和分析也可能會發現此類問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM