可能重复:
Program received signal: “0”. Data Formatters temporarily unavailable
我在XiB上取200个OBShapedButtons并在那里设置背景图像。 之后,我将拍摄特定OBShapedButton的图像,并将图像着色并再次将其设置为OBShapedButton的背景。
-(void)onTick:(NSTimer *)timer {
//Database
UIImage *setColor=[[UIImage alloc] init];
for (int i=0; i<[dataArray count]; i++)
{ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
currentLevelMaleValue =[[[dataArray objectAtIndex:i] objectForKey:@"CurrentLevelMaleColor"] doubleValue];
printf("Current val is %f",currentLevelMaleValue);
for (OBShapedButton *obshapedCountryButtons in scrollBaseView.subviews)
{
if (obshapedCountryButtons.tag==i+1)
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapButton:)];
tap.numberOfTouchesRequired=1;
tap.numberOfTapsRequired=1;
[obshapedCountryButtons addGestureRecognizer:tap];
[obshapedCountryButtons addTarget:self action:@selector(buttonTagTrap:) forControlEvents:UIControlEventTouchDown];
//[obshapedCountryButtons addTarget:self action:@selector(tapButton:) forControlEvents:UIControlStateHighlighted];
setColor=[obshapedCountryButtons imageForState:UIControlStateNormal];
countryCode =[self getCountryColorCurrentLevel:currentLevelMaleValue];
setColor =[setColor imageTintedWithColor:countryCode];
[obshapedCountryButtons setImage:setColor forState:UIControlStateNormal];[pool release];
// [setColor release];
// [obshapedCountryButtons release];
// [tap release];
//
}
// }
}
}
}
现在,我收到此错误[循环执行约40次后] -
编程接收信号:“0”。数据格式化程序暂时 不可用,将在'继续'后重试。 (加载未知错误 共享库“/Developer/usr/lib/libXcodeDebuggerSupport.dylib
收到此警告 -
收到内存警告
然后该应用程序将被终止。
注意:
没有对象分配。
请帮我解决一些想法。我该怎么办呢?
答案 0 :(得分:5)
UIImage *setColor=[[UIImage alloc] init];
是内存泄漏,因为您没有释放它。实际上,分配不是必需的,因为您要为其分配一些其他值。同样地,tap
也未发布,因为您已对该代码进行了评论。
对此的建议。尝试将此代码块放在NSAutoreleasePool
。
修改强>
-(void)onTick:(NSTimer *)timer {
//Database
UIImage *setColor;// =[[UIImage alloc] init];
for (int i=0; i<[dataArray count]; i++)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
currentLevelMaleValue =[[[dataArray objectAtIndex:i] objectForKey:@"CurrentLevelMaleColor"] doubleValue];
printf("Current val is %f",currentLevelMaleValue);
for (OBShapedButton *obshapedCountryButtons in scrollBaseView.subviews)
{
NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];
if (obshapedCountryButtons.tag==i+1)
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapButton:)];
tap.numberOfTouchesRequired=1;
tap.numberOfTapsRequired=1;
[obshapedCountryButtons addGestureRecognizer:tap];
[obshapedCountryButtons addTarget:self action:@selector(buttonTagTrap:) forControlEvents:UIControlEventTouchDown];
//[obshapedCountryButtons addTarget:self action:@selector(tapButton:) forControlEvents:UIControlStateHighlighted];
setColor=[obshapedCountryButtons imageForState:UIControlStateNormal];
countryCode =[self getCountryColorCurrentLevel:currentLevelMaleValue];
setColor =[setColor imageTintedWithColor:countryCode];
[obshapedCountryButtons setImage:setColor forState:UIControlStateNormal];[pool release];
// [setColor release];
// [obshapedCountryButtons release];
[tap release];
}
[pool1 drain];
}
[pool drain];
}
}
答案 1 :(得分:1)
使用Instruments对您的应用进行配置,以检查是否存在内存泄漏。
如果没有泄漏,那么你试图分配太多的内存,因为200个按钮可能很多。唯一的解决方案就是懒洋洋地加载:在任何时候你应该只在内存中有用户可见的按钮。
答案 2 :(得分:1)
内存警告是一种在iOS中实现的内存管理方法。如果设备内存不足,它将发出内存警告。它希望每个正在运行的应用程序都通过清除尽可能多的脏内存来响应此警告。它会做三轮内存警告。前两个级别是清除内存的基本消息。如果你没有及时回复它们,或者没有在第3级清除足够的内存,你的应用程序将被终止,因为它不适合iOS。
在return;
块末尾粘贴if (obshapedCountryButtons.tag==i+1)
。
取消注释[setColor release]; [tap release];
代码。使用当前标记查找对象是个坏主意。用一些发现块替换foreach循环。
index = [scrollBaseView.subviews indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
}