【问题标题】:Can we release some memory in Objective-c that a variable does not own but points to?我们可以在 Objective-c 中释放一些变量不拥有但指向的内存吗?
【发布时间】:2011-03-31 10:46:26
【问题描述】:

我有一些这样的代码:

NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release]; 

var1 = nil;

这是正确的还是内存泄漏? 据我所知,根据Object Ownership policy

,只有 var1 可以释放第一行中分配的内存

【问题讨论】:

    标签: objective-c memory memory-management retaincount


    【解决方案1】:

    您的代码释放内存,因为只有一次分配和一次释放 - 指向对象的指针数量不是一个因素。

    所有权是Object Ownership policy 谈到的一个概念,因为如果您遵循指南,它可以更轻松地管理并最终防止与发布您不应该发布(或不发布)相关的问题你应该做的事情)。

    【讨论】:

      【解决方案2】:

      您的代码没问题,没有泄漏。但似乎你并不真正理解指针。指针不能拥有另一个对象,它只是告诉计算机正在访问哪个对象的引用。在 Cocoa 的引用计数内存模型中,有多少指针指向单个对象并不重要。

      在尝试学习 Objective-C 之前,您确实应该学习 C(尤其是指针)。

      【讨论】:

        【解决方案3】:

        您的示例不会导致内存泄漏,因为var1var2 指向内存中的同一个对象,因此alloc 调用具有匹配的release。但是,如果将 NSObject 保留为分配给 var2,则会出现内存泄漏,因为没有匹配的 release

        当内存管理指南谈到所有权的概念时,并不意味着一个变量(例如var1)拥有一个对象;它更多的是关于“范围”拥有它(例如类或方法)。在您的示例中,包含这些语句的方法将负责释放对象。

        【讨论】:

          【解决方案4】:

          保持引用计数的是对象,而不是指向对象的指针。如果您有十几个指向一个对象的指针,您可以使用其中任何一个来释放该对象,因为它们都指向同一个对象。但是,如果您不玩这类游戏,遵循您的代码并确保您没有内存管理问题要容易得多。

          【讨论】:

            猜你喜欢
            • 2021-12-20
            • 1970-01-01
            • 2014-09-05
            • 1970-01-01
            • 2011-05-31
            • 1970-01-01
            • 1970-01-01
            • 2019-11-20
            • 2018-11-14
            相关资源
            最近更新 更多