iOS:内存泄漏代码

有人能告诉我为什么下面的代码在ARC下泄漏内存? 我用Instruments测试了它们,它显示它们会导致内存泄漏,但我不知道如何修复它们?

static inline NSString* cachePathForKey(NSString* directory, NSString* key) {
    return [directory stringByAppendingPathComponent:key]; //leak
}

@property (nonatomic,strong) NSMutableData *postBody;

    if (![self postBody]) {
        [self setPostBody:[NSMutableData data]]; //leak
    }

另一个问题:这些工具向我显示“ 所有堆分配 ”和“ 所有匿名VM实时字节 。 例如,如果一个应用程序占用超过80M(例如),它会崩溃。 那么80M意味着所有堆分配还是两者

更新:

正如我在下面的一个评论中提到的,我现在正在将非ARC ASIHttpRequest更改为ARC模式。 泄漏来了。 以ASIInputStream为例:

+ (id)inputStreamWithData:(NSData *)data request:(ASIHTTPRequest *)theRequest {
    ASIInputStream *theStream = [[self alloc] init]; //leak 42%
    [theStream setRequest:theRequest];
    NSInputStream *is = [NSInputStream inputStreamWithData:data]; //leak 58%
    [theStream setStream:is];
    return theStream;
}

这是在黑暗中拍摄的,但在C功能上,你可以试试这个

__attribute__((ns_returns_autoreleased))
static inline NSString* cachePathForKey(NSString* directory, NSString* key) {
    return [directory stringByAppendingPathComponent:key]; //leak
}

参看 铿锵文档的更多信息。 你也可以尝试摆脱static inline并看看是否有帮助。


如果您将ARC和非ARC代码混合在一起,那么很难在没有看到大图的情况下给您提供建议。 我不知道你的技能水平是什么,但我会让新手远离尝试这种混合。

我通过将它放入一个新的Empty iOS应用程序中来测试一段代码; 看起来像这样:

这是我完整的AppDelegate实现,它不会执行任何操作,但会不断运行您的cachePathForKey函数。

#import "AppDelegate.h"

@implementation AppDelegate

static inline NSString* cachePathForKey(NSString* directory, NSString* key) {
    return [directory stringByAppendingPathComponent:key]; //leak
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    while (YES) {
        @autoreleasepool {
            NSString *s = cachePathForKey(@"/my/fake/dir", @"key");
        }
    }

    return YES;
}

@end

我运行Xcode,Product> Profile,当Instruments启动时,我选择Memory> Leaks。 它没有发现问题。 你可以尝试从头开始建立起来,看看你是否可以通过这种方式找到问题。

另一种技术是复制你的项目(或分支;我强烈建议版本控制,特别是git )。 然后开始剥离代码,直到找到仍然泄漏的最小代码。 然后,您可以在某处发布该代码; github是常见的,无论是作为一个小块 - 一个要点 - 或作为一个完整的Xcode项目。

无论哪种方式,自上而下或自下而上,这是令人沮丧和费力,就像一个困难的科学发现,或一个难以捉摸的警方调查。 但是,通过顽强的决心解决这些问题是成为软件开发人员的重要组成部分。 这里有一个非常有帮助的社区。 祝你好运。

链接地址: http://www.djcxy.com/p/94547.html

上一篇: iOS: Memory leak codes

下一篇: Finding JavaScript memory leaks with Chrome