1

私は次のコードを持っています:

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配列に変換するのは苦痛になる)ことを理解しています。

これについての助けに感謝します。

4

2 に答える 2

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をあなたに与えます。しかしもちろん、それは別のバグにつながります。それは、少し前にItems[40]にたまたまNSStringがあったものをリークしたということです。

したがって、毎回常に前の文字列を解放するようにするか、多くの労力を節約して、代わりにNSMutableArrayを使用することができます。NSMutableArrayは、それぞれの新しい値を保持し、置き換えられたばかりの値を解放します。それは大変な労力だとあなたが言っていることは知っています。あなたのコードを見なければ誰も言うことはできませんが、保存する各オブジェクトを考慮することは実際にはもっと労力がかかるかもしれません。

それがお役に立てば幸いです。

于 2012-08-05T02:04:14.723 に答える
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);
于 2012-08-05T03:37:36.277 に答える