嘿,我正在尝试使用 cStringUsingEncoding 将 NSString 转换为 C 字符串,但出现内存泄漏。我的理解是 cStringUsingEncoding 返回一个指向字符数组的指针,该数组仅保证在 NSString 对象的持续时间内存在。因此,您应该将其内容复制到另一个字符串。这就是我的问题所在......
我有一个函数接受 NSString 并将其转换为 C 字符串副本。为了进行测试,我对以下方法进行了 1,000 次迭代(以确保没有泄漏)。
-(void)test{
NSString *test = [[NSString alloc] initWithString:@"Hello world!"];
for(int i=0; i<1000; i++)
{
char *tmp = [self returnCopiedCString:test];
//free memory
free(tmp);
}
[test release];
}
非常简单的代码......问题是它疯狂地泄漏。现在,在您得出结论之前,我的 returnCopiedCString 函数运行得很好。我通过声明并复制 C 字符串来测试它,以排除出现问题的可能性。在函数内部我使用以下代码来转换它
-(char *)returnCopiedCString:(NSString *)input{
//retain input
[input retain];
//get length of encoded C-string
int len = [input lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
//allocate memory for new C-string + null terminated byte
char *toReturn = (char *)malloc((sizeof(char) * len) +1);
//copy NSString to C-string
strcpy(toReturn,[input cStringUsingEncoding:NSUTF8StringEncoding]);
//release input
[input release];
//return pointer to newly copied string
return toReturn;
}
也非常简单。然后我开始仔细思考,也许是因为我在 for 循环之外声明了 test,因此它永远不会被释放,我将所有这些 const char* 留在 cStringUsingEncoding 方法中。所以我将第一个函数更改为如下:
-(void)test{
for(int i=0; i<1000; i++)
{
NSString *test = [[NSString alloc] initWithString:@"Hello world!"];
char *tmp = [self returnCopiedCString:test];
//free memory
[test release];
free(tmp);
}
}
但仍然没有运气。有人对这里可能出现的问题有任何想法吗?提前谢谢大家!