此代码正在使用 iPad 4S ,但是,当在 iPad 1 上运行时会导致崩溃。
代码没有使用ARC,(我不想使用ARC,因为我试图掌握内存管理的概念)。
The implementation file on pastebin
代码是Coin Flip App,用户可以从不同的类中选择硬币数量,实现文件可以访问该值。
我最初认为阵列给了我麻烦。根据我对内存管理的理解,我已将它们声明为@property(nonatomic, retain)
,这意味着我拥有所有权,因此必须在dealloc
方法中释放它们。
一旦对象的dealloc
达到 0 ,就会调用retainCount
方法。我尽力了解这个问题。
但我不确定是否有,因为代码适用于 4s 。
答案 0 :(得分:3)
请参阅上面有关提供崩溃日志的评论 - 但是:
我从您的代码中看到您在整个地方使用retainCount
方法。 不要这样做!
retainCount
永远不应该像这样使用 - 这是一个非常容易混淆的方法,在99%的情况下只会造成进一步的麻烦。关于这一点,Apple的文档非常清楚:不要将retainCount
用于此类事情。有关详细信息,请参阅此问题(评分最高的答案实际上是现在担任Apple Frameworks工程师的人员):
答案 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方法可能无法准确反映真实的保留计数,因为它不考虑对象的自动释放。