在objective-c中释放数组的内存问题

Posted

技术标签:

【中文标题】在objective-c中释放数组的内存问题【英文标题】:memory problem with array releasing in 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 时添加,这就是为什么两者都会改变及时查看我如何解决这个问题。 //[内容发布];

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在objective-c中释放数组的内存问题的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 自动释放内存管理

在 Objective-C 中使用 TBXML 时的内存泄漏

Objective-C:内存泄漏与自动释放的多重分配?

Objective-C内存管理之自动释放池

Objective-C内存管理之自动释放池

Objective-C内存管理之自动释放池