【问题标题】:Retain, Release on iPhone and iPad [closed]在 iPhone 和 iPad 上保留、发布 [关闭]
【发布时间】:2012-08-11 16:47:41
【问题描述】:

此代码在 iPad 4S 上运行,但是在 iPad 1 上运行时会导致崩溃。

代码没有使用 ARC,(我也不希望使用 ARC,因为我试图掌握内存管理的概念)。

The header file on pastebin

The implementation file on pastebin

代码是一个硬币翻转App,用户可以选择不同类的硬币数量,这个值由实现文件访问。

我最初认为阵列给我带来了麻烦。根据我对内存管理的理解,我将它们声明为@property(nonatomic, retain),这意味着我拥有所有权,因此必须在dealloc 方法中释放它们。 一旦对象的retainCount 达到0,就会调用dealloc 方法。我已尽力了解问题所在。

但我不确定是否有,因为代码适用于 4s

【问题讨论】:

  • 没有像 iPad 4S 这样的东西 :)
  • 请发布您的崩溃日志 - 如果它在一台设备上运行但在另一台设备上运行,则可能不是内存问题,更有可能是其他问题。如果您发布崩溃日志,则问题的根本原因将更容易诊断。没有他们,人们不太可能想通读您的所有代码。
  • 在 iPad 1 上加载所有可能会遇到内存警告的图像,因为它的内存比 iPhone 4S 少。
  • @lxt 抱歉,我不想让自己看起来像是在尝试免费回答。通常我会查看 XCode 中的日志,但是当它在 iPad 上崩溃时,它只会进入黑屏。没有日志,就是因为这个原因我把代码贴出来了。
  • @Ríomhaire - 正如其他人所指出的那样,您很可能会收到内存警告(当我说“不是内存问题”时,我并不是真的意思 - 我的意思是,不是一个糟糕的访问问题)。这就是为什么在旧设备(可用内存较少)上会遇到问题的原因。

标签: iphone objective-c ios ipad memory-management


【解决方案1】:

请参阅上面关于提供崩溃日志的评论 - 然而

我从您的代码中看到您到处都在使用retainCount 方法。 不要这样做!

retainCount 永远不应该这样使用 - 这是一个非常容易混淆的命名方法,在 99% 的情况下只会造成进一步的麻烦。 Apple 的文档在这一点上非常清楚:不要将retainCount 用于此类事情。有关更多信息,请参阅此问题(评分最高的答案实际上是由现在担任 Apple Frameworks 工程师的人提供的):

When to use -retainCount?

【讨论】:

  • 我注意到,自从我上次查看以来,Apple 已经更新了文档,所以现在他们明确声明“不要使用这种方法”
  • 使用 ARC 的另一个原因 - 使用 retainCount 是构建错误
  • 好的,谢谢,我正在使用它来尝试调试问题。在我包含该代码之前发生了崩溃。
【解决方案2】:

如果我遗漏了什么,我提前道歉,但看起来你的内存不足是因为你正在使用:

    @property(nonatomic, retain)  NSMutableArray *myArray;

一个“保留的”合成器,当你这样做时,你也为数组分配了更多的内存:

    [[NSMutableArray alloc] init]

所以你实际上是在这样做:

    [self setMyArray:[[NSMutableArray alloc] init]];

这导致数组在分配和分配给数组变量时都被保留。保留计数为 2。相反,我会使用:

    [self setMyArray:[NSMutableArray array]];

在这种情况下,[NSMutableArray array] 方法会在数组返回之前自动释放它的内存。设置器将保留应用于数组,因为它将它分配给您的变量。 Retain count 为 1。因此,当您在 dealloc 中释放变量时,数组内存被释放。

请注意,retainCount 方法可能无法准确反映真实的保留计数,因为它不考虑对象的自动释放。

【讨论】:

  • 谢谢@Mike M,。出于这个原因,我曾尝试使用 headsTails =[NSArray arrayWithObjects: 而不是 allocinit 来实现代码。但是,当我在 dealloc 中的 [headsT​​ails release] 处执行应用程序崩溃时,出现错误消息*** error for object 0x581210: pointer being freed was not allocated。所以你是说我应该省略[headsT​​ails release]。我还应该在哪里包括[self setHeadsTails: headsTails]。我尝试了不同的位置,但它导致了崩溃。感谢您向我解释这一点。
  • self.headsT​​ails = [[NSArray arrayWithObjects 我认为是等价的。 (对不起,我以为你以前就是这样)
【解决方案3】:

该代码存在很多问题。

• 当 NSArray 可以使用时使用 NSMutableArray

• 调用 fillArray 过于频繁

• 一次加载大量图像(可能是内存问题的来源,无论如何)

• 有一堆可能应该是实例变量的全局变量

• 这样做:[NSString stringWithFormat:@" "](直接使用@" "

• 完全使用retainCount

• 泄漏一些物体

发布崩溃日志以获取有关实际崩溃的更多信息。使用静态分析器(构建和分析)并首先修复所有指示的问题。

【讨论】:

  • 非常感谢您的出色反馈。我会立即解决这个问题,然后发布崩溃日志。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2011-05-11
相关资源
最近更新 更多