设置框架时,“参数包含未初始化的数据”

时间:2014-03-06 07:12:24

标签: ios objective-c

我是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.

我得到“通过值传递的struct参数包含未初始化的数据(例如,通过字段链:'origin.x')”错误描述。

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

先谢谢..

3 个答案:

答案 0 :(得分:2)

问题是编译器无法确定是否曾到达过if / else-if块之一,在这种情况下,labelframe仍未被初始化。您可以添加其他其他内容,也可以将labelframe初始化为CGRectZero。它不是内存错误,而是逻辑错误。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

像这样初始化您的CGRect labelframe;

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

CGRect labelframe = CGRectZero;

或添加其他条件LIKE BELOW将解决您的问题

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;