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
,那麼您可以更加確信沒有任何內容會被複制。NSString
與字節的緩衝區,但告訴獲取從NSData
NSString
被釋放那麼,這是爲什麼dangero我們?基本上,如果字節緩衝區從NSStrings
下面消失,Bad Things™可能發生(可能崩潰)。
但是,如果你很聰明,這將允許您創建子字符串而不復制底層字節。
狡猾思想:
你可以使veryLargeString
一個保留相關聯的對象上substring
(即,基本上使substring
的veryLargeString
所有者)。這將確保veryLargeString
的生命至少與substring
一樣長。你會是這樣做的:
static char ParentStringKey;
objc_setAssociatedObject(substring, &ParentStringKey, veryLargeString, OBJC_ASSOCIATION_RETAIN);
當substring
被釋放,這將也會自動釋放其對veryLargeString
保留。
不,沒有。 – PengOne
有沒有辦法做出這樣的功能,我將如何去做呢? – Aspyn