iphone——内存泄漏

iphone——内存泄漏,iphone,objective-c,ios,memory-management,xcode4.5,Iphone,Objective C,Ios,Memory Management,Xcode4.5,虽然启用了自动引用计数,但内存泄漏 我做了一点调试,发现了应用程序获得此输出的问题: ***错误:无法分配区域***在malloc\u error\u break中设置断点以进行调试 我追踪到这一点: if (currentTime < 60) { currentTimeMin = 0; ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime]; } if (currentTime

虽然启用了自动引用计数,但内存泄漏

我做了一点调试,发现了应用程序获得此输出的问题:
***错误:无法分配区域***在malloc\u error\u break中设置断点以进行调试

我追踪到这一点:

if (currentTime < 60) {
    currentTimeMin = 0;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime];
}
if (currentTime >= 60) {
    currentTimeMin = 1;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -60];
}
if (currentTime >= 120) {
    currentTimeMin = 2;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -120];
}
if (currentTime >= 180) {
    currentTimeMin = 3;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -180];
}
if (currentTime >= 240) {
    currentTimeMin = 4;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -240];
}
if (totalTime < 60) {
    totalTimeMin = 0;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime];
}
if (totalTime >= 60) {
    totalTimeMin = 1;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -60];
}
if (totalTime >= 120) {
    totalTimeMin = 2;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -120];
}
if (totalTime >= 180) {
    totalTimeMin = 3;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -180];
}
if (totalTime >= 240) {
    totalTimeMin = 4;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -240];
}
if(当前时间<60){
currentTimeMin=0;
ct.text=[NSString stringWithFormat:@“%i:%i”,currentTimeMin,currentTime];
}
如果(当前时间>=60){
currentTimeMin=1;
ct.text=[NSString stringWithFormat:@“%i:%i”,currentTimeMin,currentTime-60];
}
如果(当前时间>=120){
currentTimeMin=2;
ct.text=[NSString stringWithFormat:@“%i:%i”,currentTimeMin,currentTime-120];
}
如果(当前时间>=180){
currentTimeMin=3;
ct.text=[NSString stringWithFormat:@“%i:%i”,currentTimeMin,currentTime-180];
}
如果(当前时间>=240){
currentTimeMin=4;
ct.text=[NSString stringWithFormat:@“%i:%i”,currentTimeMin,currentTime-240];
}
如果(总时间<60){
totalTimeMin=0;
tt.text=[NSString stringWithFormat:@“%i:%i”,totalTimeMin,totalTime];
}
如果(总时间>=60){
totalTimeMin=1;
tt.text=[NSString stringWithFormat:@“%i:%i”,totalTimeMin,totalTime-60];
}
如果(总时间>=120){
totalTimeMin=2;
tt.text=[NSString stringWithFormat:@“%i:%i”,totalTimeMin,totalTime-120];
}
如果(总时间>=180){
totalTimeMin=3;
tt.text=[NSString stringWithFormat:@“%i:%i”,totalTimeMin,totalTime-180];
}
如果(总时间>=240){
totalTimeMin=4;
tt.text=[NSString stringWithFormat:@“%i:%i”,totalTimeMin,totalTime-240];
}
我认为问题出在标签上:ct和tt,但我不确定,也不知道为什么。直到一天前我尝试了一点uitableview,一切都很好


致以最良好的祝愿!Martin

这个代码在循环中吗?如果是,您需要将代码放入自动释放池中

while(someStuff) {
    @autoreleasepool {
        //Your code here
    }
}

这段代码不应该导致泄漏。你的错误在别处。启用guard malloc并阅读有关调试和评测objective-c的内容。

您是否尝试过添加
malloc\u error\u break
断点的建议?您将相同的文本设置了4次。有什么原因吗?stringWithFormat本身不会产生问题。虽然可能是你把堆和StutffFuffic格式都发现了。(假设当前时间是60,研究控件如何通过代码。)(在尝试用Objto-C做更多的事情之前,考虑用java工作一段时间)为什么你需要使用显式自动删除池?因为要创建的字符串对象的数量?默认情况下,它们都将放在主应用程序池中。当然,它们可能会比预期的持续时间更长,因为每次通过循环时池不会被排空,但它们不会显示为泄漏,对吗?@Metable如果在循环中创建足够多的自动释放对象,则在释放自动释放对象之前,应用程序可能会耗尽内存。通过在循环中使用像这样的显式自动释放池,可以确保这不是问题。这是适当的预弧和带弧。这些对象没有泄漏,但在循环中没有自动释放池,它们只是不断累积,因为循环阻止它们被及时清理。@rmaddy感谢您的解释。我解释得不够清楚。我知道在循环中有一个自动释放池的好处;不是在循环结束时释放所有自动释放的对象,而是在循环的每次迭代结束时释放它们。我的意思是,虽然这可能会提高效率,但它并不能阻止内存泄漏,因此不是一个答案;这应该是一个评论。他问的是为什么会出现内存泄漏,而不是如何在循环中使用自动释放池来提高效率。这让我很困惑。@metable提问者报告的错误是当内存不足时出现的错误。他写的代码不应该泄漏,但如果你在一个循环中创建自动释放的对象,它可能看起来像内存泄漏,即使它不是。这是有道理的。谢谢你的解释。我应该看到错误并仔细考虑一下。