问题标签 [autorelease]

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 回答
378 浏览

objective-c - 为什么便利构造函数或对象工厂必须关心释放对象?

实际上,如果您使用名称中带有“new”、“create”、“alloc”或“copy”的方法,那么您有责任释放返回给您的对象。但是:为什么这些方法会调用 -autorelease?这不会导致“过度释放”对象吗?

假设我从这样的方法中获取该对象,然后我调用 -release 。该对象在 Autorelease Pool 中,并且引用计数为 0。当 Autorelease Pool 被释放时,接下来会发生什么?

0 投票
2 回答
4914 浏览

iphone - 当我执行选择器InBackground: 时,为什么没有自动释放池?

我正在调用一个进入后台线程的方法:

然后,我有这个由选择器调用的方法实现:

尽管我确实为该线程创建了一个自动释放池,但我总是收到此错误:

如果我拿走自动释放池,我会收到一大堆这样的消息。我还尝试围绕 performSelectorInBackground: 的调用创建一个自动释放池,但这无济于事。

我怀疑这个参数,但我不知道为什么编译器会抱怨一个 NSCFNumber。我错过了什么吗?

我的实例变量都是“非原子的”。这会是个问题吗?

更新:我可能还怀疑某些变量已添加到主线程的自动释放池中(可能是 ivar),现在它试图在错误的自动释放池中释放那个变量?如果是这样,我该如何解决?(该死,这个线程的东西很复杂;))

0 投票
13 回答
77094 浏览

iphone - 如何找到 malloc “双重释放”错误的原因?

我正在用 Objective-C 编写一个应用程序,我收到了这个错误:

MyApp(2121,0xb0185000) malloc: *** 对象 0x1068310 错误: double free
*** 在 malloc_error_break 中设置断点进行调试

当我释放一个 NSAutoreleasePool 并且我无法弄清楚我要释放两次的对象时,就会发生这种情况。

我如何设置他的断点?

有没有办法知道这个“对象0x1068310”是什么?

0 投票
3 回答
2224 浏览

iphone - NSAutoreleasePool 跨方法携带?

我正在构建一个 iPhone 应用程序,我在其中分离一些线程以在后台执行长时间运行的工作,以免挂起 UI。我知道线程需要 NSAutoreleasePool 实例来进行内存管理。我不确定线程​​方法是否调用另一个方法 - 该方法是否还需要 NSAutoreleasePool?

示例代码:

我问的原因是我收到的错误是对象正在自动释放而没有适当的池,并且“只是泄漏”。

我已经看到人们根本没有自动释放池的其他问题,我理解为什么需要自动释放池。我特别想知道在(在本例中)创建的自动释放池是否threadedMethod适用于在anotherMethod.

0 投票
2 回答
125 浏览

objective-c - 在这种情况下如何处理内存管理?

我有两个类,一个处理数据库连接的类和一个实体类。db 类有一个名为 GetEntityByID:(int)entity_id 的实例方法。此方法执行一个简单的选择语句,并使用 init 方法创建一个 Entity 类实例。

这很好用,但是调用 GetEntityByID 的人必须记住释放它。由于 GetEntityByID 不是“init”方法,这似乎不对。在这种情况下,我如何最好地处理内存管理?

0 投票
7 回答
2483 浏览

iphone - 在将对象添加到集合之前使用自动释放?

我一直在查看 StackOverflow 上提出的问题,但是关于 Objective-C 中的内存管理的问题太多了,我找不到我想要的答案。

问题是在将新创建的对象添加到集合(如 NSMutableArray)之前调用 autorelease 是否可以(并且推荐)?或者我应该在添加后明确释放它。(我知道 NSMutableArray 将保留该对象)

这说明了我的问题:

场景 A(自动释放):

场景 B(显式发布):

我认为两者都是正确的,但我不确定,而且我肯定不知道首选方式是什么。

Objective-C 大师能否对此有所了解?

0 投票
2 回答
1689 浏览

iphone - 辅助 NSThread 运行循环中需要自动释放池在哪里?

我的应用程序的辅助线程的运行循环如下。它有一个嵌套的控制循环。

  • 外循环在应用程序期间运行
  • 内部循环在一个视图打开时运行,然后线程在视图未打开时等待。
  • 通过内循环的时间很短,只有几分之一秒。

我的代码不会故意将任何自动释放的对象留在未释放的池中,但我不知道操作系统在做什么。

在主线程中,cocoa 在每次通过运行循环时都包装了一个自动释放池。
在这个次要线程中,我相信最接近的等价物是通过内部循环。

内部自动释放池包装每个通过内部循环的通道

中间环绕内部循环,因此在此级别创建和自动释放的对象在应用程序终止之前不会保留。

外部池包裹了整个运行循环。

我如何确定所有这些池的创建和发布对我的代码速度有什么影响。
我如何确定所有三个池是必要的还是矫枉过正的?




代码和解释:

组合:

  • 一个内部while循环
  • NSCondition *processCondition
  • 在和processGo之间切换YESNO

允许我在不取消线程的情况下停止并启动内部 while 循环。


执行进入内部while循环。

当主线程设置

执行离开内部while循环并
在外部循环的下一次通过时整理,执行命中

并等待

如果主线程重置

并打电话

执行重新进入内循环

0 投票
3 回答
4355 浏览

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

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

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

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

谢谢你的帮助!

0 投票
2 回答
2528 浏览

iphone - iPhone 开发 - 释放一个自动释放的对象

如果我释放一个自动释放的对象会发生什么?它是我想释放的自动释放 UIButton,创建 UIButton 的唯一方法是使用方便的方法 buttonWithType:。它会像普通对象一样从内存中释放吗?或者我应该让自动释放池来处理它?如果可以的话,我一开始就不会让它自动发布。

谢谢!!

0 投票
3 回答
1348 浏览

objective-c - 从数组和引用指针中删除后释放

因此,在某些情况下,我有一些与删除对象有关的泄漏。

前提: - 我有一个 NSMutableArray 树对象(树对象知道如何绘制自己)。- 我有一个参考指针(Tree *selected),它基本上指向我最后接触的任何树。- 请注意,*selected 指针是弱引用。

好的,到目前为止一切顺利。

问题:当我删除一棵树时出现泄漏。从列表中,我确保被删除的树在将其从数组中删除之前在内部释放所有内容(从数组中删除它应该自动调用 release )。

我尝试了什么:我注意到我的 Tree *selected 指针通过 self 属性被分配了触摸树:

self.selected = 树;

...通过这样做,我知道它正在被保留。所以我试图做的是调用:

[self.selected release];

从数组中删除树后,我立即调用了它。...但是此时它崩溃了,基本上说明它已经发布了。

问题:为什么我会收到此错误消息?我从数组中删除了它,但是我的 self.selected 指针仍然有一个保留的计数,因此我不应该释放它吗?

也许我应该在删除过程之后将其设置为零?或者,也许我应该在删除过程之前将其设置为自动释放?