保留,在iPhone和iPad上发布

时间:2012-08-15 11:28:20

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

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

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

The header file on pastebin

The implementation file on pastebin

代码是Coin Flip App,用户可以从不同的类中选择硬币数量,实现文件可以访问该值。

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

When to use -retainCount?

答案 1 :(得分:1)

该代码存在很多问题。

•当NSArray执行

时使用NSMutableArray

•过于频繁地调用fillArray

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

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

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

•完全使用retainCount

•泄漏一些物品

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

答案 2 :(得分:0)

如果我错过了某些内容,我会事先道歉,但看起来你的内存已经用完了,因为你正在使用:

    @property(nonatomic, retain)  NSMutableArray *myArray;

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

    [[NSMutableArray alloc] init]

所以你有效地做到了这一点:

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

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

    [self setMyArray:[NSMutableArray array]];

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

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