麻烦发现内存泄漏cStringUsingEncoding

嘿,我试图使用cStringUsingEncoding将NSString转换为C字符串,但我有内存泄漏。 我的理解是cStringUsingEncoding返回一个指向字符数组的指针,该字符数组只保证在NSString对象的持续时间内存在。 因此,您应该将其内容复制到另一个字符串。 这就是我的问题所在……

我有一个函数接受NSString并将其转换为C字符串副本。 仅仅为了测试,我运行了以下方法的1000次迭代(以确保没有泄漏)。

-(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循环之外声明测试,因此它永远不会被释放,我将从cStringUsingEncoding方法中留下所有这些const char *。 所以我改变了第一个函数如下:

  -(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); } } 

但仍然没有运气。 有没有人对这里的问题有什么想法? 先谢谢了!

从文档:

返回的C字符串保证仅在接收器被释放之前有效,或者直到当前自动释放池被清空为止,以先发生者为准。 您应该复制C字符串或使用getCString:maxLength:encoding:如果它需要存储超出此时间的C字符串。

我认为cStringUsingEncoding是为转换后的字符串分配内存到指定的编码,如果你没有使用自动释放池,你就不会保留接收器,所以永远不会释放这个内存。