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 {...} を追加しようとしましたが、何もしませんでした。まだメモリ使用量が増えています...