【问题标题】:memory problem with array releasing in objective-c在objective-c中释放数组的内存问题
【发布时间】:2011-04-11 06:37:04
【问题描述】:

我遇到了这个问题,任何人都可以帮助我 这是我的代码。此代码在第一次点击时有效,但在点击 2 次时会出错

ma​​lloc: 对象 0x4e226a4 错误:已释放对象的校验和不正确 - 对象可能在被释放后被修改。 ** 在 malloc_error_break 中设置断点来调试**bug

- (void)updateTextViewContents {
    content = [[NSMutableString alloc] init];   
    for (int i = 0; i <[ _scoresArray count]; i++)
    {
    NSMutableString *data = [_scoresArray objectAtIndex:i];
        [content appendString:data];
        if([content isEqualToString:UserText.text]&&[content isEqualToString:PassText.text])
        {
        UIAlertView *alt = [[UIAlertView alloc] initWithTitle:nil message:@"Valid User" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alt show];
            [alt release];
            [content release];

        }
        else    
        {
        UIAlertView *alt1 = [[UIAlertView alloc] initWithTitle:nil message:@"NOT A Valid User" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alt1 show];
        [alt1 release];
        }
    }

当我在这里发布时,它可以工作,但是当我通过输入正确的用户名和密码点击第二次时,两者都会改变视图显示。我认为这会发生,因为数组会在每次 cilck 时添加,这就是为什么两者都会改变及时查看我如何解决这个问题。 //[内容发布];

}

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    这里产生内存问题是因为,

    你在 if 条件下释放 content NSMutableString 然后再次追加它。

    所以,不要释放到 for 循环中,将其释放到 for 循环之外。

    - (void)updateTextViewContents {

    content = [[NSMutableString alloc] init];
    
    for (int i = 0; i <[ _scoresArray count]; i++) 
    {
    
        NSMutableString *data = [_scoresArray objectAtIndex:i];
        [content appendString:data];
        if([content isEqualToString:UserText.text]&&[content isEqualToString:PassText.text])
        {
            UIAlertView *alt = [[UIAlertView alloc] initWithTitle:nil message:@"Valid User" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alt show];
            [alt release];
            //[content release]; - Not release here.
    
        }
        else    
        {
            UIAlertView *alt1 = [[UIAlertView alloc] initWithTitle:nil message:@"NOT A Valid User" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alt1 show];
            [alt1 release];
        }
    }
    
    [content release];
    

    【讨论】:

    • 它可以工作,但当我输入错误的用户名和密码时不会显示其他警报视图
    • 你好,从内容变量中删除字符串而不是释放它。要删除字符串,您可以使用 [content deleteCharactersInRange:((NSRange)range)];方法。
    【解决方案2】:

    你不能替换

    NSMutableString *data = [_scoresArray objectAtIndex:i];
            [content appendString:data];
    

    有了这个

        [content appendString:[_scoresArray objectAtIndex:i]];
    

    【讨论】:

      【解决方案3】:

      您的两个警报都显示,因为您的循环将 break 放在它是有效用户之后,因为您不能在它是有效用户之后通过循环 希望这会有所帮助 祝你好运

      【讨论】:

        【解决方案4】:

        您在 if 条件下已发布内容。对于下一次迭代,您再次尝试将数据附加到内容中,如果在上一次迭代中条件为真,则该内容已被释放。因此你得到了那个错误 object was probably modified after being freed。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-25
          • 2011-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-05
          • 1970-01-01
          相关资源
          最近更新 更多