Objective c NSMutableData不自动释放内存

Objective c NSMutableData不自动释放内存,objective-c,memory-management,automatic-ref-counting,nsdata,Objective C,Memory Management,Automatic Ref Counting,Nsdata,我正在写一个iOS程序,我有一个内存泄漏。我在macOS上复制它,我不知道如何解决它。这很简单 int main(int argc, const char * argv[]) { @autoreleasepool { system("top -l 1 | grep LEAK"); // baseline NSMutableData* dataobj = [NSMutableData dataWithLength:DATA_SIZE]; sy

我正在写一个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];
由于您不是此对象的所有者,因此它被放置在自动释放池中。由于您的代码完全嵌入在
@autoreleasepool{…}
中,因此它无法检测数据的释放,因为它由该池保存


您的代码不包含泄漏,操作系统负责清理。这通常会使你的实验成功很成问题。最后,我要赞同阿明的评论:你使用了错误的方法。您应该改用仪器。

top不是检测内存泄漏的工具。感谢您花时间写下答案!我使用Xcode来显示内存层次结构图,事实上,在设置为nil之后,autorelease池仍然保留对NSConcreteData的引用。在池外设置一个断点,引用就会消失,但它仍然会占用内存(正如您所说,这是操作系统的清理工作)。由于我的程序对内存使用的要求非常严格,所以我将切换到C风格的malloc/free,这是我所期望的。