我正在使用libical库解析iCalendar格式,并从其中读取我需要的信息。到目前为止,它运行得非常好,但是有一件奇怪的事情是关于它的。这是我的密码:
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倍,我的内存使用量将增长约400 or,再也不会被释放。
icalvalue_as_ical_string_r方法没有空闲的方法,因为它正在返回char *.
如何解决这个问题,有什么建议吗?我很感激你的帮助!
编辑
看看苹果医生说:
要从string对象获取C字符串,建议使用UTF8String。这将使用UTF8字符串编码返回一个const *。
const char *cString = [@"Hello, world" UTF8String];您收到的C字符串是由一个临时对象拥有的,在自动释放发生时将变得无效。如果您想获得一个永久的C字符串,您必须创建一个缓冲区并复制该方法返回的const *的内容。
但是如果使用弧线,现在如何正确地释放字符*字符串呢?我试图在while-循环前面添加@autoRelease{.},但没有做任何努力。还在增加内存使用量..。
发布于 2012-07-16 14:31:06
小心使用“没有空闲的method...because --它是返回一个char*”的语句;这是你永远不能仅仅假设的事情。
在没有文档的情况下,您可以查看库的源代码来查看它所做的事情;例如:
8c-source.html
不幸的是,这个函数可以做很多不同的事情。当然,在某些情况下,在返回的缓冲区上调用free()是正确的,但可能并不是每一种情况都确保了这一点。
我认为最好向库的维护人员请求一种适当的解除分配方法。他们需要清理自己的烂摊子;icalvalue_as_ical_string_r()函数在switch中至少有十几种情况,它们可能有不同的去分配要求。
发布于 2012-07-16 14:26:18
icalvalue_as_ical_string_r返回一个char *,因为它为结果字符串执行了一个malloc()。如果指针为非空,则必须在使用后释放()它。
https://stackoverflow.com/questions/11505372
复制相似问题