在objective-c中释放数组的内存问题
Posted
技术标签:
【中文标题】在objective-c中释放数组的内存问题【英文标题】:memory problem with array releasing in objective-c 【发布时间】:2011-04-11 06:37:04 【问题描述】:我遇到了这个问题,任何人都可以帮助我 这是我的代码。此代码在第一次点击时有效,但在点击 2 次时会出错
malloc: 对象 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中释放数组的内存问题的主要内容,如果未能解决你的问题,请参考以下文章