2014-03-06 31 views
3

我是IOS开发新手,处理内存泄漏。在我的项目分析项目时,我得到了一些内存泄漏。但我无法修复下面的代码中的以下逻辑错误。“参数包含未初始化的数据”设置框时

CGRect labelframe; 


if ([questonmod.questionType isEqualToString:@"type1"]) 
{ 
    nooflinesint=questonmod.questiontext.length/20; 

    if (nooflinesint<1) 
    { 
     nooflinesint=nooflinesint+2; 
    } 
    else 
    { 
     nooflinesint=nooflinesint+1; 
    } 

    labelframe= CGRectMake(5, 0, cell.frame.size.width-10, nooflinesint*18); 


} 
else if([questonmod.questionType isEqualToString:@"type2"]) 
{ 

    nooflinesint=questonmod.questiontext.length/10; 

    if (nooflinesint<1) 
    { 
     nooflinesint=nooflinesint+2; 
    } 
    else 
    { 
     nooflinesint=nooflinesint+1; 
    } 
    labelframe= CGRectMake(5,0,cell.frame.size.width-155,nooflinesint*16); 

} 


cell.questionlabel.frame=labelframe; //at this line I got below error. 

我得到“合格按值结构参数包含未初始化数据(例如,经由现场链:‘origin.x’)”的错误描述。

请建议我该如何解决上述问题..

在此先感谢..

+0

您使用ARC? – Aly

+0

@Aly ...是的我正在使用ARC。 – Vidhyanand

回答

1

初始化您CGRect labelframe;这样

CGRect labelframe = CGRectMake(0, 0, 0, 0); 

CGRect labelframe = CGRectZero; 

或添加其他条件如下面将解决你的问题

if ([questonmod.questionType isEqualToString:@"type1"]) 
{ 
    nooflinesint=questonmod.questiontext.length/20; 

    if (nooflinesint<1) 
    { 
     nooflinesint=nooflinesint+2; 
    } 
    else 
    { 
     nooflinesint=nooflinesint+1; 
    } 

    labelframe= CGRectMake(5, 0, cell.frame.size.width-10, nooflinesint*18); 


} 
else if([questonmod.questionType isEqualToString:@"type2"]) 
{ 

    nooflinesint=questonmod.questiontext.length/10; 

    if (nooflinesint<1) 
    { 
     nooflinesint=nooflinesint+2; 
    } 
    else 
    { 
     nooflinesint=nooflinesint+1; 
    } 
    labelframe= CGRectMake(5,0,cell.frame.size.width-155,nooflinesint*16); 

} 
else{ 
    labelframe = CGRectMake(0, 0, 0, 0); 
} 


cell.questionlabel.frame=labelframe; 
+0

ThankQ @rajesh。它解决了我的问题.. – Vidhyanand

1

这是无关的内存泄漏。上面的代码不保证设置labelFrame,因为它有一个if,那么一个else if。如果两个条件都不成立,则帧将不会被初始化。

设置默认框架或添加最后的else子句。

+0

ThanQ @jrturton为你的答案.. – Vidhyanand

2

问题是,编译器无法确定if/else-if块之一是否已达到,在这种情况下,labelframe仍将被初始化。您可以添加其他人或只需初始化labelframeCGRectZero。这不是内存错误,而是逻辑错误。

+0

ThanQ @samir ... – Vidhyanand

+0

@samir上面的评论是错误的。因为有一个'else'子句,编译器可以100%确信labelframe会得到一个值。问题是你需要使用以下代码正确初始化labeframe:CGRect labelframe = ... –