-2

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

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

pastebin 上的头文件

pastebin 上的实现文件

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

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

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

4

3 回答 3

3

请参阅我上面关于提供崩溃日志的评论 -但是

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

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

何时使用 -retainCount?

于 2012-08-15T11:33:57.010 回答
1

There are a lot of issues with that code.

• uses NSMutableArray when an NSArray will do

• calls fillArray way too often

• loads a ton of images all at once (likely source of memory issue, regardless)

• has a bunch of global variables that are probably supposed to be instance variables

• Does this: [NSString stringWithFormat:@" "] (just use @" " directly)

• uses retainCount at all

• leaks some objects

Post the crash log for more information on the actual crash. Use the static analyzer (build and analyze) and fix all indicated issues first.

于 2012-08-15T15:12:11.107 回答
0

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

    @property(nonatomic, retain)  NSMutableArray *myArray;

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

    [[NSMutableArray alloc] init]

所以你有效地这样做了:

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

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

    [self setMyArray:[NSMutableArray array]];

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

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

于 2012-08-15T12:14:02.573 回答