问题标签 [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 回答
156 浏览

iphone - 多次使用的类方法导致泄漏?

假设我正在开发一款游戏。我数千次运行以下类方法:

NSBundle *bundle=[NSBundle mainBundle];

我没有创建一个自动释放池,并且一直释放调用上述类方法的对象。我创建了一个对象,它调用了上面的类方法,我释放了它,上千次。

3个问题:

  • 内存泄漏了吗?
  • 如果我跑:

NSAutoReleasePool *pool=[[NSAutoReleasePool alloc] init]; [池排水];

然后它会有效地释放在类方法中创建的所有那些 NSBundles 吗?

  • 如果我写道:

池=无;

而不是写:

[池排水];

能达到同样的效果吗?这是好习惯吗?

这三个问题是相互关联的,我将加强澄清它们的问题:)

0 投票
2 回答
3000 浏览

objective-c - 自动释放 NSString

我是否负责释放这个字符串,默认情况下它是自动释放的吗?

0 投票
2 回答
895 浏览

c++ - Objective-C 适当使用 autorelease?

我正在学习 Objective-C,我正在尝试编写一个 Vector3D 类。

在 C++ 或 Java 中,我想要实现的函数看起来像这样:

现在在objective-c中我不能返回一个对象,只能返回一个对象指针。这是否是使用自动释放的合适位置(在返回之前?)。这将使我能够链接 Vector3D 类上的方法(因为许多方法返回对象本身),但是与手动分配和释放对象相比,这会特别低效吗?在objective-c中是否有其他常用的模式用于返回对象?

我想对班级进行的操作示例:

谢谢。

0 投票
4 回答
5700 浏览

objective-c - 在长时间运行的后台线程上定期耗尽自动释放池的最佳方法?

在开发人员文档中,它说:

如果您的应用程序或线程是长期存在的并且可能会生成大量自动释放对象,您应该定期排空并创建自动释放池(就像 Application Kit 在主线程上所做的那样);否则,自动释放的对象会累积并且您的内存占用会增加。但是,如果您的分离线程不进行 Cocoa 调用,则不需要创建自动释放池。

我想知道最好的方法是什么。我有几种我认为可行的方法,但不知道哪个是“最好的”。我目前有一个方法可以启动线程并让它等待操作执行:

我能想到的选择是:

1)在while(accessoryThreadIsRunning)中添加一个计数器,这样每50或100次它就会耗尽自动释放池并创建一个新的。

2)每次我在那个线程中执行一个方法(使用performSelector:onThread:),我可以创建一个自动释放池,然后在方法结束时释放它。

3)制作一个计时器,以便将池排空然后定期创建。

我认为选项 1 是最好的,但想知道是否有不同的方式我应该这样做。谢谢!

0 投票
3 回答
136 浏览

iphone - 为什么它在没有“保留”对象的情况下工作正常?

在这里,我在“test”方法中使用了“tempString”的自动释放。根据规则,我应该在 main 中使用“[temp retain]”。但我没有使用它。它仍然可以正常工作并打印输出。那么“留”的需要是什么?谁能告诉我原因?提前致谢。

0 投票
3 回答
1047 浏览

iphone - iPhone 应用程序中的 EXC_BAD_ACCESS - 内存管理问题

作为参考,我已经阅读:

我认为这会有所帮助:)。

这个应用程序是一个教学工具,旨在帮助人们想象简单的遗传学。只是一些背景,所以变量名称和东西会有意义。这是应用程序运行时执行的主要代码:

当我以各种方式运行它时会发生以下情况:

  • 在没有断点的情况下运行,它在第二次 sleep() 之后但在“第 3 轮”NSLog 之前崩溃,没有控制台消息。
  • 在启用断点但未定义断点的情况下运行,它将贯穿整个序列。在第四次 sleep() 之后,它会因 EXC_BAD_ACCESS 而崩溃。
  • 在启用断点和 NSZombiesEnabled 的情况下运行,它执行与上述相同的操作 - 没有更多信息,只是 EXC_BAD_ACCESS。
  • 在 Instruments 中运行,没有显示泄漏。

这是被调用四次的例程:

如果不粘贴整个代码,可能性ByMatingFather:withMother:mutations 函数将返回一个 NSMutableArray。该例程使用以下方法声明数组:

然后它:

它不会向可能性发送释放或自动释放消息;我的理解是,以我的方式创建数组是一种隐式自动释放。我不想分配数组,因为我要返回它,所以没有机会显式释放它。

NSMutableArray 中保存的对象是一个自定义类。它们添加如下:

这似乎在大多数情况下都有效。至少,当断点被启用时,程序会毫无怨言地运行代码直到结束,如上所述。

关于我做错了什么的任何建议,在这里?这显然是某种内存管理问题,但我无法在脑海中对其进行分类。

顺便说一句,徒劳地把东西扔在墙上试图弄清楚,我确实修改了主程序中的一行,如下所示:

无济于事。结果相同。所以问题不在于保留可能性ByMatingFather:withMother:mutations 返回的数组。强制保留该回报并没有帮助。

0 投票
3 回答
287 浏览

objective-c - 减少具有大量自动释放变量的函数的内存占用?

我仍在思考 Objective-C 中内存管理的一些细微差别,并提出了以下我不确定的案例:

在这里,decimalNumberByMultiplyingBy 和 decimalNumberBySubtracting 将创建很多 NSDecimalNumber,据我了解,它们最终会自动释放,但我担心直到那个时候包含的程序会占用大量内存。

我应该在某处引入自动释放池吗?(如果是在哪里?)这是否会对性能产生显着影响(与使用大量内存的副作用相比)?

自动释放在这里使用正确的机制吗?我是否应该考虑将循环分开并在完成后手动释放内存?

这可能是一个 n00b 问题,但我试图了解在这种情况下最佳实践是什么。

0 投票
3 回答
1192 浏览

ios - iPhone NSMutableArray 和 NSKeyedUnarchiver unarchiveObjectWithFile 发布异常

我存档了一个自定义对象数组 (NSMutableArray),这些对象实现了 . 一旦我将它从文件加载到保留属性@property (nonatomic, retain) NSMutableArray *buddies; 对象的释放计数为 2(正确,它是自动释放的 1 + 属性保留的 1)但是没有人释放它并且保留计数变为 1,所以当我释放它时,我得到 -[__NSArrayM retainCount]: message sent to解除分配的实例(我认为因为 1 保留计数是自动释放)

这是完整的代码:

BuddieListViewController.h

BuddieListViewController.m

有人知道为什么会这样吗?

0 投票
3 回答
3351 浏览

objective-c - Objective-C 初始化(静态方法)调用不止一次?

我在 Objective-C 中有类似的代码:

我在整个代码中都引用了这个,指向这个的指针永远不会改变,因为我在我的代码中到处都在使用它。问题是,当我使用 运行我的测试时GHUnit,我在更改 ' 指针时遇到了奇怪的问题GlobalVariableThatShouldNeverChange(即它正在被重新初始化。我在通过自动释放池释放变量时遇到了问题,这是固定的,我有解决这个问题的方法,但我想知道为什么

谢谢!

0 投票
2 回答
2920 浏览

iphone - iPhone - substringToIndex / substringFromIndex / substringWithRange 内存泄漏

Instruments leaks 说这段代码泄露了:

name 是泄漏的对象。有一些奇怪的事情:它只是有时会泄漏,并非总是如此(这段代码在我的应用程序正常执行期间执行了数百次,但它只泄漏了 3-4 次)。另一个奇怪的事情是,我认为名称对象是一个自动释放对象,并且它永远不会明确地保留或释放,那么它怎么会泄露呢?

看一下堆栈,substringWithRange 是由 substringToIndex 调用的,所以我认为问题出在 substringToIndex 方法中。