首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS - libical / const char *-内存使用情况

iOS - libical / const char *-内存使用情况
EN

Stack Overflow用户
提问于 2012-07-16 13:27:42
回答 2查看 542关注 0票数 1

我正在使用libical库解析iCalendar格式,并从其中读取我需要的信息。到目前为止,它运行得非常好,但是有一件奇怪的事情是关于它的。这是我的密码:

代码语言:javascript
复制
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);

//.

我确实用仪器检查了我的内存使用情况,并能够发现,这一行似乎漏了:

代码语言:javascript
复制
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 *。

代码语言:javascript
复制
const char *cString = [@"Hello, world" UTF8String];

您收到的C字符串是由一个临时对象拥有的,在自动释放发生时将变得无效。如果您想获得一个永久的C字符串,您必须创建一个缓冲区并复制该方法返回的const *的内容。

但是如果使用弧线,现在如何正确地释放字符*字符串呢?我试图在while-循环前面添加@autoRelease{.},但没有做任何努力。还在增加内存使用量..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-16 14:31:06

小心使用“没有空闲的method...because --它是返回一个char*”的语句;这是你永远不能仅仅假设的事情。

在没有文档的情况下,您可以查看库的源代码来查看它所做的事情;例如:

8c-source.html

不幸的是,这个函数可以做很多不同的事情。当然,在某些情况下,在返回的缓冲区上调用free()是正确的,但可能并不是每一种情况都确保了这一点。

我认为最好向库的维护人员请求一种适当的解除分配方法。他们需要清理自己的烂摊子;icalvalue_as_ical_string_r()函数在switch中至少有十几种情况,它们可能有不同的去分配要求。

票数 1
EN

Stack Overflow用户

发布于 2012-07-16 14:26:18

icalvalue_as_ical_string_r返回一个char *,因为它为结果字符串执行了一个malloc()。如果指针为非空,则必须在使用后释放()它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11505372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档