1

libical ライブラリを使用して iCalendar 形式を解析し、そこから必要な情報を読み取ります。これまでのところ問題なく動作していますが、ical に関して奇妙なことが 1 つあります。これは私のコードです:

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 * の内容をコピーする必要があります。

しかし、アークを使用している場合、char * 文字列を適切に解放する方法は? while ループの前に @autorelease {...} を追加しようとしましたが、何もしませんでした。まだメモリ使用量が増えています...

4

2 に答える 2

1

icalvalue_as_ical_string_rchar *結果文字列に対してmalloc()を実行したため、を返します。ポインタがNULL以外の場合は、使用後にfree()する必要があります。

于 2012-07-16T14:26:18.663 に答える
1

「char* を返すため、自由なメソッドはありません」という文には注意してください。それは決してあなたがただ仮定できるものではありません。

ドキュメントがない場合は、ライブラリのソース コードを見て、その機能を確認できます。例えば:

http://libical.sourcearchive.com/documentation/0.44-2/icalvalue_8c-source.html

残念ながら、この関数はさまざまなことを行うことができます。確かに、返されたバッファでの呼び出しが正しい場合もありfree()ますが、すべての場合で保証されているわけではありません。

ライブラリの管理者に適切な解放方法を要求するのが最善だと思います。彼らは自分の混乱を片付ける必要があります。関数には、異なる割り当て解除要件を持つ可能性icalvalue_as_ical_string_r()のある a に少なくとも 12 のケースがあります。switch

于 2012-07-16T14:31:06.543 に答える