我正在使用 libical 库来解析 iCalendar 格式并从中读取我需要的信息。到目前为止,它工作得非常好,但是关于 ical 有一件奇怪的事情。这是我的代码:
icalcomponent *root = icalparser_parse_string([iCalData cStringUsingEncoding:NSUTF8StringEncoding]);
if (root)
{
icalcomponent *currentEvent = icalcomponent_get_first_component(root, ICAL_VEVENT_COMPONENT);
while (currentEvent)
{
while(currentProperty)
{
icalvalue *value = icalproperty_get_value(currentProperty);
char *icalString = icalvalue_as_ical_string_r(value); //seems to leak
NSString *currentValueAsString = [NSString stringWithCString:icalString
encoding:NSUTF8StringEncoding];
icalvalue_free(value);
//...
//import data
//...
icalString = nil;
currentValueAsString = nil;
icalproperty_free(currentProperty);
currentProperty = icalcomponent_get_next_property(currentEvent, ICAL_ANY_PROPERTY);
} //end while
} //end while
icalcomponent_free(currentEvent);
}
icalcomponent_free(root);
//...
我确实使用了工具来检查我的内存使用情况,并且能够发现这条线似乎泄漏了:
char *icalString = icalvalue_as_ical_string_r(value); //seems to leak
如果我将此行复制并粘贴 5 或 6 次,我的内存使用量将增长约 400kb,并且再也不会被释放。
该方法没有免费方法,icalvalue_as_ical_string_r
因为它返回一个 char *..
任何建议如何解决这个问题?我将不胜感激任何帮助!
编辑
看一下苹果文档说以下内容:
要从字符串对象中获取 C 字符串,建议使用 UTF8String。这将返回一个使用 UTF8 字符串编码的 const char *。
const char *cString = [@"Hello, world" UTF8String];
您收到的 C 字符串归一个临时对象所有,并且在发生自动解除分配时将变为无效。如果要获取永久的 C 字符串,则必须创建一个缓冲区并复制该方法返回的 const char * 的内容。
但是如果使用 arc,现在如何正确释放 char * 字符串?我试图在我的while循环前面添加@autorelease {...},但没有任何努力。仍在增加内存使用...