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