IOS ApiにはsubstringFromIndexのような機能がありますが、他の点ではメモリの使用量が非常に少ない(私は非常に大きな文字列を使用しています)。もし私がその機能を果たさなければならないなら、それをどうやってやるのだろう?substringFromIndexのようなメモリ使用量が少ない機能はありますか?
事前
IOS ApiにはsubstringFromIndexのような機能がありますが、他の点ではメモリの使用量が非常に少ない(私は非常に大きな文字列を使用しています)。もし私がその機能を果たさなければならないなら、それをどうやってやるのだろう?substringFromIndexのようなメモリ使用量が少ない機能はありますか?
事前
のおかげではい、それはラウンドアバウトのようなものだと潜在的に危険な
は、ここにあなたが何をすべきかです:
NSString *veryLargeString = ...;
NSUInteger startingIndex = ...;
NSData *veryLargeStringData = [veryLargeString dataUsingEncoding:NSUTF8StringEncoding];
const void *bytes = [veryLargeStringData bytes];
const void *subBytes = bytes + startingIndex;
NSUInteger subLength = [veryLargeStringData length] - startingIndex;
NSString *substring = [[NSString alloc] initWithBytesNoCopy:subBytes length:subLength encoding:NSUTF8StringEncoding freeWhenDone:NO];
この何をしている:
NSData
というスーパー長い文字列を使用すると、何もコピーされないことがはるかに自信があります。NSString
を作成しますが、言って、いくつかのポインタ演算にNSData
NSString
は、なぜこのdangeroある割り当てが解除されたとき米国?基本的に、バイトバッファがNSStrings
の下から消えた場合、Bad Things™が発生する可能性があります(クラッシュする可能性があります)。
しかし、これについて賢明ならば、基礎となるバイトをコピーせずに部分文字列を作成することができます。
よこしまな考え:あなたはsubstring
にveryLargeString
保持関連付けられたオブジェクトを作ることができる
(すなわち、基本的にsubstring
veryLargeString
の所有者を作ります)。これにより、少なくともsubstring
と同じくらい長くveryLargeString
が存続することが保証されます。あなたはこのようにそれを行うだろう:substring
の割り当てが解除された場合
static char ParentStringKey;
objc_setAssociatedObject(substring, &ParentStringKey, veryLargeString, OBJC_ASSOCIATION_RETAIN);
を、それはまた、自動的にそのveryLargeString
に保持を解除します。
ありがとう、私は今それを試してみます。優れた説明 – Aspyn
'NSString'の' cStringUsingEncoding: 'メソッドを使って' char * 'を取得し、それを処理するために'
+1 Bad Things(TM)の場合は...まあ、本当に気の利いた解決策です。 – Till
いいえ、存在しません。 – PengOne
そのような機能を実現する方法はありますか?それをどうやってやるのでしょうか? – Aspyn