NSMutableData 不自动释放内存
NSMutableData not releasing memory automatically
我正在编写 iOS 程序,但出现内存泄漏。我在macOS上重现了,不知道怎么解决。很简单。
int main(int argc, const char * argv[]) {
@autoreleasepool {
system("top -l 1 | grep LEAK"); // baseline
NSMutableData* dataobj = [NSMutableData dataWithLength:DATA_SIZE];
system("top -l 1 | grep LEAK"); // baseline + 8 bytes
memset([dataobj mutableBytes], 1, DATA_SIZE);
system("top -l 1 | grep LEAK"); // baseline + DATA_SIZE
dataobj = nil;
system("top -l 1 | grep LEAK"); // baseline + DATA_SIZE
}
return 0;
}
最后,我希望内存使用率再次达到基线,但事实并非如此。等了10秒还是一样的结果。我相信一定是我对ARC或者NSData
.
的理解有问题
谢谢大家提前看一下。
您正在使用以下内容创建数据:
NSMutableData* dataobj = [NSMutableData dataWithLength:DATA_SIZE];
由于 Memory Management Policy 你不是这个对象的所有者,它被放置在自动释放池中。由于您的代码完全嵌入到 @autoreleasepool { ... }
中,因此它无法检测到数据的重新分配,因为它由该池保存。
您的代码不包含泄漏,操作系统负责清理。这通常会使您的实验是否成功非常值得怀疑。最后,我想赞同 Amin 的评论:你使用了错误的方法。您应该改用 Instruments。
我正在编写 iOS 程序,但出现内存泄漏。我在macOS上重现了,不知道怎么解决。很简单。
int main(int argc, const char * argv[]) {
@autoreleasepool {
system("top -l 1 | grep LEAK"); // baseline
NSMutableData* dataobj = [NSMutableData dataWithLength:DATA_SIZE];
system("top -l 1 | grep LEAK"); // baseline + 8 bytes
memset([dataobj mutableBytes], 1, DATA_SIZE);
system("top -l 1 | grep LEAK"); // baseline + DATA_SIZE
dataobj = nil;
system("top -l 1 | grep LEAK"); // baseline + DATA_SIZE
}
return 0;
}
最后,我希望内存使用率再次达到基线,但事实并非如此。等了10秒还是一样的结果。我相信一定是我对ARC或者NSData
.
谢谢大家提前看一下。
您正在使用以下内容创建数据:
NSMutableData* dataobj = [NSMutableData dataWithLength:DATA_SIZE];
由于 Memory Management Policy 你不是这个对象的所有者,它被放置在自动释放池中。由于您的代码完全嵌入到 @autoreleasepool { ... }
中,因此它无法检测到数据的重新分配,因为它由该池保存。
您的代码不包含泄漏,操作系统负责清理。这通常会使您的实验是否成功非常值得怀疑。最后,我想赞同 Amin 的评论:你使用了错误的方法。您应该改用 Instruments。