在iPhone和iPad上保留、发布
此代码适用于iPad 4S,但在iPad 1上运行时会导致崩溃 代码没有使用ARC(我也不希望使用ARC,因为我试图掌握内存管理的概念) 该代码是一个硬币翻转应用程序,用户可以从不同的类中选择硬币的数量,该值由实现文件访问 我最初认为阵列给我带来了麻烦。根据我对内存管理的理解,我将它们声明为在iPhone和iPad上保留、发布,iphone,objective-c,ios,ipad,memory-management,Iphone,Objective C,Ios,Ipad,Memory Management,此代码适用于iPad 4S,但在iPad 1上运行时会导致崩溃 代码没有使用ARC(我也不希望使用ARC,因为我试图掌握内存管理的概念) 该代码是一个硬币翻转应用程序,用户可以从不同的类中选择硬币的数量,该值由实现文件访问 我最初认为阵列给我带来了麻烦。根据我对内存管理的理解,我将它们声明为@property(nonatomic,retain),这意味着我拥有所有权,因此必须通过dealloc方法释放它们。 一旦对象的retainCount达到0,就会调用dealloc方法。我已尽力去理解这
@property(nonatomic,retain)
,这意味着我拥有所有权,因此必须通过dealloc
方法释放它们。
一旦对象的retainCount
达到0,就会调用dealloc
方法。我已尽力去理解这个问题
但是我不确定是否有,因为代码在4s上运行请参见我上面关于提供崩溃日志的评论-但是: 我从你的代码中看到你到处都在使用
retainCount
方法<不要这样做强>
retainCount
永远不应该像这样使用-这是一种命名非常混乱的方法,在99%的情况下只会导致进一步的麻烦。苹果的文档在这一点上非常清楚:不要使用retainCount
进行类似的操作。有关更多信息,请参见此问题(排名靠前的答案实际上是一位现在担任苹果框架工程师的人):
如果我遗漏了一些内容,我会提前向您道歉,但您的内存似乎已用完,因为您正在使用:
@property(nonatomic, retain) NSMutableArray *myArray;
“保留”合成器,执行此操作时,您还可以为阵列分配更多内存:
[[NSMutableArray alloc] init]
因此,您有效地做到了这一点:
[self setMyArray:[[NSMutableArray alloc] init]];
这会导致分配和分配给数组变量时都保留数组。保留计数为2。相反,我会使用:
[self setMyArray:[NSMutableArray array]];
在这种情况下,[NSMutableArray array]方法会在返回数组之前自动释放该数组的内存。setter将在数组分配给变量时对数组应用retain。保留计数为1。因此,当您释放dealloc中的变量时,数组内存将被释放
注意,由于不考虑对象上的自动更新,保留计数方法可能无法准确地反映真正的保留计数。
代码中存在很多问题。 •在NSArray可用时使用NSMutableArray
•调用数组太频繁 •一次加载一吨图像(可能是内存问题的根源) •有一组可能是实例变量的全局变量 •这样做:[NSString stringWithFormat:@”“]
(直接使用@”“
)
•完全使用retainCount
•泄漏一些物体
发布崩溃日志以获取关于实际崩溃的更多信息。使用静态分析器(构建和分析),首先修复所有指示的问题。没有iPad 4S:)请发布您的崩溃日志-如果它在一台设备上工作,但在另一台设备上不工作,则可能不是内存问题,更可能是其他问题。如果您发布崩溃日志,那么问题的根本原因将更容易诊断。人们不太可能在没有它们的情况下通读你的所有代码。加载所有这些图像,你可能会在iPad 1上遇到内存警告,因为它的内存比iPhone 4S要少。@lxt我很抱歉,我不想让人觉得我在试图找一个免费的答案。通常我会在XCode中查看日志,但当它在iPad上崩溃时,它就会变成黑屏。没有日志,正是因为这个原因,我发布了代码。@Ríomhaire-正如其他人所指出的,很可能你收到了一个内存警告(当我说“不是内存问题”时,我不是真的这么说-我更是说,不是一个坏的访问问题)。这就是为什么在旧设备上(可用内存较少)会遇到问题的原因。我注意到,自从我上次查看以来,苹果已经更新了文档,所以现在它们明确声明“不要使用此方法”。使用ARC的另一个原因是使用
重新计数是一个构建错误,谢谢,我使用它是为了调试这个问题。崩溃发生在我加入代码之前。谢谢@Mike M,。出于这个原因,我尝试使用headsTails=[NSArray arrayWithObjects:
来实现代码,而不是使用alloc
和init
。但是,当我这样做时,应用程序在[headsTails release]上崩溃在dealloc中,由于错误消息***对象0x581210的错误:未分配被释放的指针
。因此,您是说我应该忽略[headsTails release]。另外,我应该在哪里包括[self-setHeadsTails:headsTails]
。我尝试了不同的位置,但它导致了崩溃。谢谢你向我解释。self.headsTails=[[NSArray arrayWithObjects是等效的,我想。(对不起,我以为你以前就是这么做的)非常感谢你的精彩反馈。我现在就解决这个问题,然后发布崩溃日志。