0

当我遇到死胡同时,我以为我真的很接近发布我的这个新应用程序了。我的代码在模拟器(Xcode 4.0.2)中没有内存泄漏,但在我的设备上报告内存泄漏。

认为我的问题与我复制一个对象有关,因为在我的故障排除尝试中,我尝试不使用副本,然后内存泄漏就消失了(但我的功能当然也是如此!)。

我所做的是将 UIView 子类的多个实例添加到数组中。这个子类(其中 cityToAdd 是一个实例的城市)有两个 UIView 和一些我需要在稍后阶段访问的变量。

如果我这样做,我的设备上会出现内存泄漏:

[arrayOfCities addObject:[[cityToAdd mutableCopy] autorelease]];

但如果我这样做,我不会(但功能松散)

[arrayOfCities addObject:cityToAdd];

在子类中,我有这个来处理复制:

- (id)mutableCopyWithZone:(NSZone *)zone{

Cities *newCity = [[Cities allocWithZone:zone] init];

[newCity initWithCityName:cityName 
                   onRing:ring 
             withTimeZone:timeZone 
       withTimeZoneOffset:timeZoneOffset 
             withDSTAngle:DSTAngle 
                   andDST:isDST];

 return newCity;

}

从 Instruments 我在设备上测试时得到这个:

在此处输入图像描述

当我深入到第二行时,它会显示: 在此处输入图像描述

最后是我的 initWithCityName 方法(抱歉发了这么长的帖子!!)我把它作为图片从 Instruments 中获取颜色和消息...

在此处输入图像描述

最后,UIIMage imageNamedUniversal 是一个扩展,可以在 iPad 上为我提供@2x 图像(但我尝试使用普通的 imageNamed 并获得相同的内存泄漏)。

我不知道从哪里开始!!欣赏任何想法。

谢谢

4

3 回答 3

0

为什么要调用两个初始化方法?您正在调用initinitWithCityName....

于 2011-06-01T02:12:35.503 回答
0

需要考虑两件事:

将 cityView 和 DSTView 添加为子视图后,您可以并且应该释放它们。

你在你的copyWithZone中初始化了两次newCity。

于 2011-06-01T02:13:42.263 回答
0

感谢您的快速回复和建议。你让我走上正轨。我添加到数组中的 cityToAdd 在循环中添加了多次,但我将 alloc 和 init 保留在循环之外。一旦我将它移到循环中,它就可以在模拟器和设备中运行。

奇怪的是模拟器没有报告内存泄漏......

再次感谢您的快速回复!

于 2011-06-01T03:21:21.470 回答