Что такое __CFString?

У меня есть arg1, который является IMessage. IMessage определяется как:

struct IMessage {
    ...
    struct CFString _field2;
    ...
};

и CFString определяется как:

    struct CFString {
    void **_vptr$CFObject;
    struct __CFString *mCFRef;
    _Bool mIsMutable;
};

и __CFString определяется как:

struct __CFString;

Моя цель - получить какую-то строку, будь то NSString или CFStringRef из arg1, так как я могу это сделать? Спасибо.

Вот ошибка, которую я получаю, когда пытаюсь nslog mCFRef:

Thread 0 crashed:

#  1  0x97b41edb in _objc_msgSend + 0x0000001B (libobjc.A.dylib + 0x00005edb)
#  2  0x9610b5f2 in __CFStringAppendFormatAndArgumentsAux + 0x00000C42 (CoreFoundation + 0x0002c5f2)
#  3  0x9610a979 in __CFStringCreateWithFormatAndArgumentsAux + 0x00000069 (CoreFoundation + 0x0002b979)
#  4  0x961b3a3e in __CFLogvEx + 0x0000008E (CoreFoundation + 0x000d4a3e)
#  5  0x9415387c in _NSLogv + 0x0000008F (Foundation + 0x0009487c)
#  6  0x941537eb in _NSLog + 0x0000001B (Foundation + 0x000947eb)

person user635064    schedule 22.03.2011    source источник
comment
Вы должны изменить объявление mCFRef в этой структуре. Должно быть CFStringRef mCFRef;. Тип CFStringRef, как и все другие типы BlahBlahRef, существует для того, чтобы подчеркнуть, что указатель должен быть непрозрачным, а не указателем на открытую для вас структуру.   -  person Peter Hosey    schedule 23.03.2011
comment
Я сделал это и все еще получаю ошибку EXC BAD ACCESS, пожалуйста, проверьте исходный вопрос об ошибке. Спасибо!   -  person user635064    schedule 23.03.2011
comment
Возможно, базовый CFStringRef является указателем void? Я попытался разыменовать пустую точку и привести ее к CFStringRef, но все равно не повезло...   -  person user635064    schedule 23.03.2011
comment
@ user635064: То, что я сказал в своем комментарии к ответу Чака, остается неизменным; то, что вы описываете, является симптомом попытки использовать что-то в качестве указателя на объект CF, который не является указателем на объект CF. Либо его никогда не было, либо он был, но его выпускали все владельцы. Вам нужно продолжить отладку оттуда.   -  person Peter Hosey    schedule 24.03.2011
comment
@ user635064: Что касается того, является ли vptr или mCFRef строкой: ну, vptr выглядит как указатель на некоторые указатели, тогда как mCFRef имеет (внутреннее определение) тип указателя CFString. См. мой первый комментарий по этому вопросу. Независимо от того, помещает ли сторонняя библиотека, которая отправляет вам эту структуру IMessage, CFString в неправильное место или еще не предоставила ее вам, или что-то в этом роде, это проблема со сторонней библиотекой, а не с Core Foundation. . Вы должны спросить разработчика библиотеки, что случилось.   -  person Peter Hosey    schedule 24.03.2011


Ответы (1)


Я не знаю, откуда вы это взяли, но CFStringRef определен как struct __CFString *const, так что у вас уже есть что-то похожее.

person Chuck    schedule 22.03.2011
comment
Спасибо за ответ. Итак, если я хочу получить CFSstringRef из arg1, я бы сделал: CFStringRef s = (arg1->_field2).mCFRef; это приводит к сбою программы. - person user635064; 22.03.2011
comment
@ user635064: Да, хотя это не имеет ничего общего с CF; это проблема в вашей программе и/или любой другой библиотеке, которую вы используете. Либо arg1 не является указателем на что-либо, либо это указатель на недостаточное хранилище, либо mCFRef не заполнен указателем на объект CFString, либо что-то установило mCFRef в указатель на объект CFString, но этот объект был выпущен всем, кому он принадлежал (и, возможно, еще одним — сверхвыпуском). Если это последний, поможет шаблон Zombies от Instruments. - person Peter Hosey; 23.03.2011
comment
эй, это для ввода. Это то, что я получаю в консоли, когда пытаюсь запустить nslog, может быть, вы догадываетесь, что происходит? Я поместил это в свой исходный вопрос с форматированием (намного легче читать). Спасибо - person user635064; 23.03.2011