【问题标题】:Why memory is not increasing?Has memory allocated physically?为什么内存没有增加?内存是否物理分配?
【发布时间】:2020-01-10 23:37:18
【问题描述】:

我已经在 Xcode 10.3 中测试过代码

- (void)loopObjectMalloc {
    while (1) {
        NSObject *obj = [[NSObject alloc] init];
    }
}

我预计 OOM 发生了,但内存没有增加。 alloc函数不是memset到物理内存吗?

【问题讨论】:

  • obj 将在每个 while 循环结束时释放。当然,内存不会增加。
  • @trungduc 但是runloop一直在工作,那么释放功能是什么时候发生的?
  • 正如@trungduc 所说,默认情况下自动引用计数(ARC)是打开的。关掉它来测试。更新:您最后的评论听起来像是在谈论自动释放功能。
  • @Kylin.Zhang 我觉得你对循环结束和函数结束有误解。
  • @trungduc 是的,我对此感到困惑,while循环中有autoreleasepool吗?

标签: objective-c malloc automatic-ref-counting memset


【解决方案1】:

默认情况下,自动引用计数 (ARC) 处于打开状态。所以obj会在每次循环结束时释放,不会增加内存。

obj 不需要等待每个循环完成。

- (void)loopObjectMalloc {
    while (1) {
        // At the beginning of each loop, `obj` is created.
        NSObject *obj = [[NSObject alloc] init];
        // End of the loop, obj is released due to out of scope.
    }
    // End of function.
}

不需要自动释放池来释放你的对象。 release 将在编译时自动插入到您的代码中。

retain、release、retainCount、autorelease 或 dealloc 不能发送给对象。相反,编译器会在编译时自动插入这些消息,包括当 dealloc 被覆盖时的 [super dealloc]。

https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Objective-C

注意如果要查看 OOM,请关闭 ARC。

【讨论】:

  • 您应该提到,只有在 ARC 开启时才会发生这种情况。
  • 我认为while循环中没有自动释放池,我仍然不知道为什么会发生释放
  • @Kylin.Zhang 我想你不明白什么是“自动释放”对象。你的问题和这个答案与它无关。 Objective-C 要求您手动 retainrelease 对象,除非您使用 ARC(现在是默认设置),这就是您问题中的功能。 ARC 系统看到该对象超出范围并插入一个release 调用到该对象。因此,它会为您管理内存。
  • @trojanfoe 我明白你的意思,非常感谢
【解决方案2】:

您可以使用桥接函数从 ARC 获取所有权:

- (void)loopObjectMalloc {
    while (1) {
        CFTypeRef obj = CFBridgingRetain([[NSObject alloc] init]);
    }
}

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 2017-04-03
    • 1970-01-01
    • 2018-05-09
    • 2021-04-16
    • 1970-01-01
    • 2014-08-24
    • 2012-12-30
    • 2020-07-18
    相关资源
    最近更新 更多