1

以下のコードを呼び出すたびに、 ARCを使用しています。「Live Bytes」が毎回少しずつ増加していることがわかります。ここでメモリ リークが発生しているに違いありません。

char* example = (char *)sqlite3_column_text(compiledStatement, 1);                                

label.text = [NSString stringWithUTF8String:example];

しかし、私が以下の方法で行うと、メモリは 1 つのバイト数で永遠に安定します。しかし、label.text の内容は私が望む正確な単語ではありません。「&#( &(*@#)#@$」のように壊れています。

char* example = (char *)sqlite3_column_text(compiledStatement, 1);                                

label.text = [NSString stringWithFormat:@"%s",example];

ここに画像の説明を入力

ここに画像の説明を入力

4

3 に答える 3

1

古い質問ですが、まだ実際です:

@jlegakis がすでに指摘しているように、これはおそらく「自動解放の問題」です。

次のようなクラスファクトリメソッドから自動解放された返されたオブジェクトを取り除くための別のアプローチを提案したいだけです[NSFoo fooWith...]:

代わりに、パターンを使用する場合

NSFoo* foo = [[NSFoo alloc] initWith...]

作成されたオブジェクトは自動解放されません。したがって、次のように書くと:

char* example = (char *)sqlite3_column_text(compiledStatement, 1);
label.text = [[NSString alloc] initWithUTF8String:example];

「自動解放の問題」はなくなるはずです。

于 2013-09-26T07:57:59.613 に答える
0

私はまったく同じ問題を抱えていました。stringWithUTF8String が内部で autorelease を使用していたため、囲んでいる autorelease プール ブロック (私の場合はアプリ全体) が終了するまでメモリが解放されなかったことが原因であることが判明しました。

実験として、これを試してください:

@autoreleasepool {
  char* example = (char *)sqlite3_column_text(compiledStatement, 1);                                
  label.text = [NSString stringWithUTF8String:example];
}

ライブ バイトの増加が止まるはずです。

于 2013-09-26T07:06:08.597 に答える