我必须从内存中删除NSString
(包含一些机密数据),但不仅要将其设置为nil
,还要删除它的字节。到目前为止我尝试过的是:
NSString *str = @"test";
NSLog(@"original string:%@", str);
CFStringRef ref = (__bridge CFStringRef)str;
const char * strPtr = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8);
memset(strPtr, 0, [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"cleared string:%@", str);
但是函数CFStringGetCStringPtr
正在返回NULL
,因此它会在memset
的行处崩溃。 Apple说here在某些情况下,该函数返回NULL
是正常的,但后来我不知道如何解决这个问题。
提前致谢
答案 0 :(得分:3)
不要将自信数据存储为字符串。你不能轻易地从内存中删除它们。
如果可能,请使用NSMutableData
来存储自信数据。
答案 1 :(得分:0)
试试这个:
NSMutableString *str = [NSMutableString stringWithString:@"test"];
NSLog(@"original string:%@", str);
CFStringRef ref = ( CFStringRef)str;
CFIndex stringLength = CFStringGetLength(ref), usedBytes = 0L;
const char * strPtr = NULL;
strPtr = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8);
char *freeUTF8StringPtr = NULL;
for(CFIndex idx = 0L; (strPtr != NULL) && (strPtr[idx] != 0); idx++)
{
if(strPtr[idx] >= 128) { strPtr = NULL; }
}
if((strPtr == NULL) && ((freeUTF8StringPtr = malloc(stringLength + 1L)) != NULL))
{
CFStringGetBytes(ref, CFRangeMake(0L, stringLength), kCFStringEncodingUTF8, '?', false, (UInt8*)freeUTF8StringPtr, stringLength, &usedBytes);
freeUTF8StringPtr[usedBytes] = 0;
strPtr = (const char *)freeUTF8StringPtr;
}
NSUInteger memorySize=[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"cleared string:%@", str);
答案 2 :(得分:-1)
我尝试过以下这样的事情: -
NSMutableString *str = @"test";
NSLog(@"original string:%@", str);
CFStringRef ref = (__bridge CFStringRef)str;//kCFStringEncodingUTF16
const char * strPtr = CFStringGetCStringPtr(ref, kCFStringEncodingUTF16);
NSUInteger memorySize=[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"cleared string:%d", memorySize);
Output := 4