Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iPhone和iPad上保留、发布_Iphone_Objective C_Ios_Ipad_Memory Management - Fatal编程技术网

在iPhone和iPad上保留、发布

在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方法。我已尽力去理解这

此代码适用于iPad 4S,但在iPad 1上运行时会导致崩溃

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

该代码是一个硬币翻转应用程序,用户可以从不同的类中选择硬币的数量,该值由实现文件访问

我最初认为阵列给我带来了麻烦。根据我对内存管理的理解,我将它们声明为
@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是等效的,我想。(对不起,我以为你以前就是这么做的)非常感谢你的精彩反馈。我现在就解决这个问题,然后发布崩溃日志。