释放对象 - 失去价值

时间:2012-08-05 01:45:32

标签: iphone objective-c xcode ipad

我有以下代码:

NSString *Items[91];

在.m文件中,作为全局数组的所有方法,我在我的init方法中执行:

for (j1 = 0; j1 <= 90; j1++)
    {
        Items[j1] = [[NSString alloc] initWithFormat:@""];
    }   

并且在某个时刻触发了不同的方法AA并执行:

Items[40] = [NSString stringWithFormat:@"40. Pers:%g each", PersExemptions];
 Items[41] =@"blah blah";

...等

并且在某些时候触发了一个不同的方法BB,我发现对于Items [40]它说自由对象,它失去了它失去目的的价值。 GRR。

我希望Items数组通过应用程序保持修改后的值直到结束,我假设使用我在init方法中使用的initWithFormat应该处理它。 我知道Items是c风格的数组(并且转换为NSMutable数组会很痛苦)如果这是问题的开始。

我很感激你的帮助。

2 个答案:

答案 0 :(得分:3)

编辑:正如@dasblinkenlight指出的那样,我假设你没有使用ARC。

你在这里使用的是一个C风格的数组,一个NSString *。

数组

问题是当你这样做时......

[NSString stringWithFormat:@"40. Pers:%g each", PersExemptions]

stringWithFormat:返回您不拥有的NSString。如果要保留阵列中的NSString,则需要保留它。或者您可以使用之前执行的alloc / initWithString:

Items[40] = [[NSString alloc] initWithFormat:@"40. Pers:%g each", PersExemptions];

这会为您提供拥有的NSString。但是,当然,这会导致另一个错误,就是你刚刚泄露了物品[40]中碰巧出现的NSString。

因此,您可以确保每次都释放前一个字符串,或者您可以节省很多精力,而只需使用NSMutableArray。 NSMutableArray将负责保留每个新值并释放刚刚替换的值。我知道你说这太费劲了,没有其他人可以说你的代码,但是考虑你存储的每个对象实际上可能更多努力。

我希望有所帮助。

答案 1 :(得分:0)

现在nsstring是:

NSString ** strArr;
int rows = 91;

然后,您需要使用malloc来动态分配内存:

int i;
strArr = malloc( rows * sizeof( strArr * ) );

for( i = 0; i < rows; i++ )
{
 strArr[ i ] = calloc( columns, sizeof( NSString ) );
}

不要忘记释放你的dealloc方法:

int i;

for( i = 0; i < rows; i++ )
{
  free( strArr[ i ] );
}
free( strArr);