问题标签 [dealloc]

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 投票
6 回答
1951 浏览

objective-c - 在 Objective-C 中,你首选的 dealloc 编码风格是什么?

我知道关于编码风格的讨论往往以灾难和无休止的火焰战争告终,但这不是我想要达到的。在过去的十年中,我主要看到了deallocObjective-C 中方法的两种不同编码风格。第一个也是最常见的一个是放在dealloc文件的底部。这也是 Apple 在 Xcode 默认模板中使用的样式。这背后的逻辑似乎dealloc是在接近对象末尾时调用,因此文件末尾似乎是一个很好的比喻。

另一方面,一些人倾向于将指令dealloc直接放在@synthesize指令下方。在我看来,这有两个主要缺点:

  1. 文件的顶部充满了无聊的代码
  2. 很难找到课堂上的重要部分,您必须向下滚动。

在我看来,最大的优势是您可以在属性和相应的release消息之间建立直接的视觉联系。

另一件事是 niling 已经发布的变量。虽然我不认为这是必要的,尤其是在整个变量在dealloc结束后被破坏的对象上下文中,但我也倾向于将变量设为 nil。我习惯于对函数范围内的变量执行此操作,所以我只是与我的编码风格保持一致。

这就是我的大多数课程的样子:

我已经提到了一些优点和缺点。对于这个话题你有什么看法?您使用的编码风格是什么dealloc为什么?还有其他我忘记提及的优点和缺点吗?

我不想在这里引发一场火焰战争。我只是想知道你使用什么风格,如果你有具体的原因,或者这最终对你来说是否无关紧要。

0 投票
14 回答
22089 浏览

java - 强制显式删除 Java 对象

我正在处理一个处理大量非常密集的流量的 Java 服务器。服务器接受来自客户端的数据包(通常为数兆字节)并将它们转发给其他客户端。服务器从不明确存储任何传入/传出的数据包。然而,服务器不断地遇到OutOfMemoryException异常。

我添加System.gc()到服务器的消息传递组件中,希望可以释放内存。此外,我将 JVM 的堆大小设置为千兆字节。我仍然遇到同样多的例外。

所以我的问题是:如何确保兆字节消息不会无限期地排队(尽管不需要)?有没有办法让我在这些对象上调用“删除”以保证它们没有使用我的堆空间?

0 投票
3 回答
21064 浏览

objective-c - 声明、分配、加载和释放 NSMutableArray 的正确方法

我在 *.h 文件中声明了我的数组:

我为它分配内存我的 *.m 文件:

我点击一个测试按钮来加载我的数组(最终每次点击都需要加载不同的值):

我在这里释放它:

这一切看起来都好吗?

因为当我稍后运行此代码时它会崩溃:

不知道为什么一个简单的“NSLog() 和计数”会使一切崩溃。


短剑,

让我这样说吧:我对指针、数组、字符串和内存有一个巨大的误解。

我已经阅读了我能找到的所有内容......但是(尚未)找到一个简单、清晰、易于理解的描述。

你能推荐一个吗?(希望不到 10 页的阅读量。)是否有参考资料可以解释这个主题......从“你有 12 年的编码经验......但没有一个处理过分配内存或指针”的角度来看。 )

所以变量名不是我引用对象的方式吗?那为什么会有呢?

我已经习惯了许多其他语言,只是这样做:

(还有什么更简单的。)


在我看来,这将是最简单的方法。(它似乎有效。但它真的正确吗?)


你没有加载你的数组 anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil]; 相反,您将其替换为一个新实例,更糟糕的是:使用一个实例,其引用实际上由您无法控制的某个实体拥有

哇。所以我可以有 20 个数组……都叫同一个名字:anArray……而且它们都不同?(没有 GLOBAL 数组这样的东西吗?)

等为了清除旧值,removeAllObject 方法可能很方便。还有变异方法,可用于一次添加多个值。

所以......首先我必须“删除所有对象”......然后我可以调用一个方法来重新添加我所有的新值。

anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] 保留]; 而不是 alloc/init 序列。

哇。我认为如果不为其分配空间,就无法将任何内容存储在数组中。

如果您真的打算替换整个数组,您可能需要考虑使用属性

我将如何使用属性来做到这一点?
做这样的事情的正确方法是什么:

就像我会做的那样:


哇。我真的完全误解了关于字符串、数组和内存的一切。我认为“简单的方法”是分配一次......使用可变数组......尽可能多地改变它......并释放它一次。

这样做的问题是没有保留这个新数组,

我认为旧阵列会消失......并且可以使用新阵列。(但我猜不是。)

此外,您有内存泄漏,因为您从未释放原始数组。

我在想旧数组不应该被释放......我还没有完成它......我只是希望改变它以包含我的新值。(但我猜不是。)

但一种是使用 [anArray release];

我在想这会导致我释放我分配的内存......(但我猜不是)......然后我必须重新分配更多内存。(但我猜不是。)

anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] 保留];

所以我必须“保留”它……所以它不会从我下面消失?(不知道为什么会这样。直到告诉它......在我最后的 dealloc 调用中。)

另一种可能更正确的修复方法是使用 addObject: 或 addObjectsFromArray: NSMutableArray 方法,而不是不断创建新数组。

我只想创建一个数组......然后随意使用它。我从不想添加到数组中。我想将其设置为我的新值。

0 投票
1 回答
132 浏览

cocoa - 使用 NSURLConnection 时如何不会发生错误?

下面是一个场景。

我做了两个控制器,A tableViewController,B viewController 和 C ScrollView。A tableViewController 具有正在进入 B viewController 的单元格。B viewController 有 C scrollView 是 B 的前视图。

C scrollView 有 NSURLConnection 对象。这起到了下载图像的作用。

( A -> pushViewController -> B (有 C) -> (C 进程 NSURLConnection 启动后))


如果我在下载图像期间关闭 C 滚动视图,则会出现错误!(下载完成后)因为当B scrollViewController 被解除时,C 的对象被释放。因此,在连接“didFinished”之后,不搜索 C 委托(在调用 didFinished 之后,处理 B 对象方法。)

这是C代码的一部分。

B的dealloc方法在这里。

我怎么不能发生错误?请帮我...

0 投票
3 回答
1414 浏览

iphone - iPhone:在 parentViewController 上调用 dealloc 会导致异常

我正在处理 viewDidUnload 和 dealloc 方法,并且在调用 [super dealloc] 时发现了一个问题;在父视图控制器中。

我有很多带有自定义代码的视图控制器,我把它们放在了父视图控制器上。因此,在定义视图控制器时,我设置了对超类的引用:

然后,在 dealloc 方法中,我调用 AbstractViewController dealloc 方法:

[super dealloc] 执行以下代码:

如果我在 iPhone Simulator 上模拟内存警告,则会引发以下异常:

但是,如果我在 AbstractViewController 中注释 [super dealloc] 行,则不会引发异常并且我的应用程序仍在运行。

再次感谢您的帮助!

0 投票
2 回答
2112 浏览

objective-c - 释放自定义对象的 NSMutableArray

我需要帮助解除我的 NSMutableArray 的自定义对象。我需要保留数组,所以我在 .h 中添加了一个属性,并在 .m 文件中的 dealloc 中释放它。当我将对象添加到数组时,我执行以下操作:

现在,我不知道如何释放 mycustomobject。如果我执行以下操作:

稍后访问数组时遇到问题。请指教。

0 投票
3 回答
5916 浏览

iphone - [CFArray release]: 发送到释放实例的消息

我在我的代码中使用以下方法:

这是一种编码良好的便捷方法吗?我认为,它返回一个自动发布的 NSMutableArray。

这个方法被另一个调用:

这个方法(otherMethod)在一些视图控制器中被调用,我想在其中存储返回的数组并在解除分配视图控制器时释放它。但是,当在此视图控制器中调用 [result retain] 时(因为我需要它可用并且我不能允许它被释放)我收到以下错误:

[CFArray release]: 发送到释放实例的消息

我试图[result retainCount]在调用保留之前记录并打印“1”。我不明白为什么调用保留时会引发错误。

谢谢,

一个

0 投票
2 回答
1090 浏览

iphone - iPhone:如何在视图释放之前停止视图中的动画

我已将自定义动画添加到 UITableViewCells。每个单元格都有自己的动画。当我弹出视图时,动画继续,我得到一个糟糕的 exec 错误,因为动画正试图访问已释放的单元格。

如何在视图被释放之前停止动画?

0 投票
2 回答
1725 浏览

iphone - 当前模态视图控制器中没有调用dealloc方法

它在我的视图控制器中

它在 DoctorListViewContrler

0 投票
2 回答
629 浏览

iphone - 使用多个表视图类的超级释放错误

我是 Iphone 应用程序的新手,我正在尝试构建一个基于标签的应用程序。我试图在两个选项卡中的图像顶部都有一个表格。在带有音频链接表的选项卡上和带有视频链接表的另一个选项卡上。

这一切都很顺利,我为这两个表创建了两个视图控制器。除了让它工作之外,所有代码都很好用,我必须在第二个选项卡的 videoTableViewController 中注释掉 - (void)dealloc {} 中的超级 dealloc。

如果我没有收到错误消息:

FREED(id): 消息 numberOfSectionsInTableView: 发送到释放对象

请帮忙,我不知道为什么会这样......