私が取り組んでいる大規模なプロジェクトを手助けしようとする非常に単純なテストアプリケーションを書いています。Objective-C NSStringメモリリークの再利用
簡単に言えば、テストアプリは所定の回数だけループし、各ループの文字列に「1」を追加します。ループが1000の倍数に達すると、文字列がリセットされ、プロセスが再び開始されます。
コードは次のとおりです。私が見ていることは、メモリ使用量が予想以上に高いことです。繰り返しごとに約0.5MBが追加されます。
newStringは再利用されませんが、使用されていたメモリを回復することなく破棄され、新しいインスタンスが作成されたようです。
最終的に、このソフトウェアは100000をはるかに超える数をカウントする必要があります。 テストとして、私が反復を1000万に変更すると、5GB以上のメモリが必要になります!
誰か提案がありますか?これまでのところ、文字列のクリアを書き、ARCをオフにして手動で再作成するさまざまな方法がありますが、予想していたメモリ量を取り戻すことはできません。
ありがとうございました!
* ps。はい、この実際のソフトウェアはまったく意味がありませんが、私が言うように、一度修正された有用なコードに移行されるテストアプリケーションです。
int targetCount = 100000;
NSString * newString;
int main(int argc, const char * argv[]) {
@autoreleasepool {
process();
return 0;
}
}
void process() {
for (int i=0; i<targetCount; i++) {
calledFunction(i);
}
}
void calledFunction(count) {
if ((count % 1000) == 0) {
newString = nil;
newString = @"";
} else {
newString = [NSString stringWithFormat:@"%@1", newString];
}
}
:-)勝つ、勝ちますか? – trojanfoe
真剣に?それはそれを修正しましたか?笑。 あなたは私の新しいヒーローです! – user2729972
これは、自動解放プールの排水頻度に関する質問です。しかし、これはとにかく使える素晴らしいパターンではありません。代わりに 'NSMutableString'を見てください。 – trojanfoe