gpt4 book ai didi

iphone - 有没有像 substringFromIndex 这样使用更少内存的函数?

转载 作者:行者123 更新时间:2023-12-03 21:04:50 34 4
gpt4 key购买 nike

IOS Api 中是否有一个类似于 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];

这是做什么的:

  1. 它将非常大的字符串作为一系列字节获取;我非常确信这实际上并没有复制字节,但一定要使用仪器来验证。如果您可以将这个超长字符串作为 NSData 而不是 NSString 来开始,那么您就可以更加确信不会复制任何内容。
  2. NSData获取实际的字节缓冲区
  3. 使用一些指针算术对字节缓冲区进行索引
  4. 计算出还剩下多少缓冲区
  5. 使用字节缓冲区创建一个新的NSString,但告诉它复制字节,并且NSString 已释放

那么,为什么这很危险?基本上,如果字节缓冲区从 NSStrings 下消失,则可能会发生 Bad Things™(可能会崩溃)。

但是,如果您很聪明,这将允许您创建子字符串而无需复制底层字节。

<小时/>

狡猾的想法:

您可以使 veryLargeString 成为 substring 上保留的关联对象(即,基本上使 substring 成为 veryLargeString 的所有者>)。这将确保 veryLargeString 的生命周期至少与 substring 一样长。你会这样做:

static char ParentStringKey;

objc_setAssociatedObject(substring, &ParentStringKey, veryLargeString, OBJC_ASSOCIATION_RETAIN);

substring 被释放时,它也会自动释放其在 veryLargeString 上的保留。

关于iphone - 有没有像 substringFromIndex 这样使用更少内存的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408645/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com