问题标签 [retain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
6015 浏览

objective-c - Objective-C 类方法的对象保留行为

保留和释放传递给类方法的对象的最佳实践是什么?

例如,如果您有一个像这样声明的“类变量”:

...这样做是正确的:

...它的缺点是调用者需要在参数上保持非零保留计数,以免它被过早释放。或者,可以这样做:

...它的缺点是如果没有相应的类级dealloc调用,它会泄漏内存。或者是否应该完全避免这种类变量欺骗,也许使用一个以更传统的方式管理这些对象的生命周期的单例类?

这是Apple 关于创建单例实例的文档

我正在使用的代码是非常漂亮(但仍然是新的)Objective Resource 项目(http://www.iphoneonrails.com/)。

0 投票
1 回答
639 浏览

iphone - Cocoa Touch 表数据源问题

我在显示来自数据源的结果时遇到了一些问题。此代码将在控制台中显示不同(且正确)的结果,但会在模拟器中导致各种随机废话。

(“结果”是该类的 NSMutableArray 属性。)

我猜这可能与数组的内存保留或数组中的字符串有关?恐怕我还没有掌握这个窍门。

[编辑以回应 Marc Bessey——我认为这里的一切都是你的基本数据源方法]

0 投票
4 回答
2800 浏览

objective-c - 关于objective-c中setter的一个问题

这是来自 The Objective-C 2.0 Programming Language 的示例。我只是想知道,在底部的设置器中,我可以使用value = [newValue retain] 而不是value = [newValue copy]吗?

0 投票
3 回答
14529 浏览

objective-c - 是什么增加了对象的保留计数?

这是我指的代码。

现在,我知道此示例代码中没有进行内存管理。需要什么?

在 getPeople 循环中,我分配了一个人(retainCount 1),然后将其添加到数组中。保留计数现在是 2,对吧?如果它是两个,我应该在将它添加到数组之后 [p release]'ing,使 retainCount 回落到 1?

我是否正确,调用者有责任释放该方法返回的数组?(这也将释放 Person 及其实例变量的内存,假设它们的计数为 1)。

我已经阅读了 Apple 的内存管理文档,但我想我最不清楚的是什么会增加对象保留计数?不过,我想我掌握了谁负责释放的想法。根据 Apple 的说法,这是基本规则:

如果您使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc、newObject 或 mutableCopy)的方法创建对象,或者向其发送保留消息,则您将获得对象的所有权。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。任何其他时间您收到一个对象,您都不能释放它。

bobDevil 的句子“只担心你明确添加到项目中的保留计数”让它点击了我。在阅读了 Apple 的所有权政策之后,本质上,创建新对象的对象/方法是负责释放 /it's/ 对它的兴趣的人。它是否正确?

现在,假设我有一个方法,它接收一个对象,并将它分配给一个实例变量。我需要正确保留收到的对象,因为我仍然对它感兴趣?

如果其中任何一个不正确,请告诉我。

0 投票
3 回答
4355 浏览

iphone - 多线程 iPhone 应用程序因 [NSAutoreleasePool 版本] 而崩溃

我在多线程 iPhone 应用程序中有一个与内存管理相关的问题。假设我们有这个方法,它在与主 UI 线程不同的线程中调用:

如您所见,我保留NSData了从网络操作中返回的信息。问题是:为什么我不应该在我的方法结束时释放(或自动释放)它?我让它工作的唯一方法是首先使用retain,然后什么都不用。如果我使用任何其他组合(什么都没有;retain然后releaseautorelease),EXC_BAD_ACCESS当我释放线程的NSAutoreleasePool. 我错过了什么?

仅供参考,这是线程的主要代码:

谢谢你的帮助!

0 投票
3 回答
2367 浏览

cocoa - NSZombies 正在吃掉我的应用程序的大脑!

我有一个保留/释放问题。我的视图非常复杂,所以我将 NSZombieEnabled 设置为 YES 并试图找出究竟是哪个对象让我感到悲伤。为了加快这个过程,我想知道是否有提示或技巧可以追踪僵尸回到他们挖出的坟墓(对不起,不得不),或者回到与他们相关的物体?神秘的控制台消息似乎没有提供太多洞察力:

我没有称为“前面的麻烦”的选择器。

编辑- 包括堆栈跟踪:

编辑 2:ObjectAlloc

在 ObjectAlloc 中查找有问题的内存地址,我找到了两个匹配项:

深入了解#0 GeneralBlock-48:

深入研究#1 CALayer:

好吧,我现在看到在#0 或#1 中更深入地钻探会显示完全相同的信息。我想这应该将故障排除减半......但我仍然不知所措......

0 投票
3 回答
262 浏览

objective-c - 何时以及为何释放对象

我在我的代码中使用这些行

我应该在哪里释放 this NSMutableArray,为什么要释放那个对象?在我的项目中,我在我的dealloc方法中释放对象,但这样做需要更多时间。

谁能解释一下?

0 投票
3 回答
1444 浏览

objective-c - 带属性的内存管理

我开始更好地理解objective-c中的内存管理,但有些东西我不明白。这是一个属性声明:

这是它看不见的合成二传手(我认为):

这为您节省了每次保留和填充的所有工作,但是说我第一次设置我的属性,它还没有被分配,所以它的引用计数是 0,对吧?所以我愿意

我不确定那里会发生什么,当它释放 nothing 时,但说该属性已经有一个值,我们设置它。在 setter 中,它首先被释放。所以这不是让它消失吗?如果它的引用计数为 1,然后在 setter 中释放它,它如何保持设置为保留的新值?

谢谢!!

0 投票
2 回答
489 浏览

objective-c - 属性属性“保留”似乎不起作用?

我已经从许多 Apple 代码示例之一中实现了一些代码,但我遇到了一些麻烦,因为其中一个属性的保留属性似乎不起作用。这是属性声明:

这是代码:

我了解 (retain) 应该导致保留计数在分配时增加 1;但是,除非我自己发送 [aController retain] 或发送 [aController release],否则代码会失败。我在这里想念什么?

0 投票
3 回答
43687 浏览

iphone - Objective C 发布、自动发布和数据类型

我是内存管理代码的新手,但我很好地理解了这个想法。

在通过 XCode 中的泄漏工具获取我的应用程序时,我注意到我只需要清理我的自定义对象,而不是例如动态创建的数组,所以我认为这些数据类型是自动释放的——因为我只需要释放数组我用作对它们有(保留)的属性。

然后我注意到一些奇怪的事情:我在某个初始化的数组上出现了泄漏,如下所示:

但不是类似的

现在,一个设置为“新”的原因是它可以有 0-99 个项目,而我知道的另一个总是 9。由于两个数组稍后根据用户传递给相同的方法交互时,如果我没有在方法结束时释放,或者如果我释放了异常,我会得到泄漏!

我将第一个数组更改为

我没有泄漏,也不必释放任何东西。谁能解释一下?