2011-03-22 27 views
0

我有arg1这是一个IMessage。消息对象定义为:什么是__CFString?

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

和CFString字符串被定义为:

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

和__CFString被定义为:

struct __CFString; 

我的目标是获得某种形式的字符串是它来自arg1的NSString或CFStringRef,那我该怎么做呢? 谢谢。

这里是我的错误,当我尝试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) 
+1

您应该在该结构中更改“mCFRef”的声明。它应该是'CFStringRef mCFRef;'。像所有其他'BlahBlahRef'类型一样,'CFStringRef'类型的存在是为了强调指针是不透明的,而不是指向一个对你开放的结构的指针。 – 2011-03-23 11:28:23

+0

我这样做,仍然得到EXC BAD ACCESS错误,请检查原始问题的错误。谢谢! – user635064 2011-03-23 17:00:52

+0

也许底层的CFStringRef是void指针?我尝试解除引用无效点并将其转换为CFStringRef,但仍然没有运气... – user635064 2011-03-23 17:17:34

回答

1

我不知道你是从得到这个,但CFStringRef被定义为struct __CFString *const,所以你已经拥有的东西,看起来相当。

+0

感谢您的回答。所以如果我想从arg1中获取CFSstringRef,我会这样做:CFStringRef s =(arg1 - > _ field2).mCFRef;这会导致程序崩溃。 – user635064 2011-03-22 20:28:57

+2

@ user635064:是的,尽管这与CF无关;这是您的程序和/或您正在使用的任何其他库的问题。 'arg1'不是一个指向任何东西的指针,或者它是一个指向没有足够存储空间的指针,或者'mCFRef'没有被一个指向CFString对象的指针填充,或者'mCFRef'设置了一个指向一个指针的指针CFString对象,但该对象已被拥有它的所有东西释放(可能还有一个 - 过度释放)。如果它是最后一个,乐器的僵尸模板将有所帮助。 – 2011-03-23 11:20:32

+0

嘿,这是输入。当我尝试登录时,这就是我在控制台中得到的,也许你可以猜测发生了什么?我把它放在我原来的问题格式(更容易阅读)。谢谢 – user635064 2011-03-23 16:51:35

相关问题