0

我在我的代码中发现了一个泄漏,其中归档和取消归档 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 是否存在错误,或者我做错了什么?

4

1 回答 1

1

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 中,您也可以在分配后立即调用 autorelease,或者使用类的自动释放创建者(如果可用)(例如 [NSString stringWithFormat:] 而不是 [[NSString alloc] initWithFormat :])。

选择 Build > Build and Analyze 也可能会显示此类问题。

于 2010-03-01T23:32:57.567 回答