NSData dataWithBytesNoCopy在释放时触发guardMalloc

时间:2011-06-20 21:29:14

标签: iphone ios web-services wsdl base64

请参阅下面的更新

<s:element name="GetFile">
    <s:complexType>
    <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="User" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string />
    <s:element minOccurs="0" maxOccurs="1" name="ObjectId" type="s:string"/>
    </s:sequence>
    </s:complexType>
</s:element>
<s:element name="GetFileResponse">
    <s:complexType>
    <s:sequence>
    <!-- This is the return value -->
    <s:element minOccurs="0" maxOccurs="1" 
       name="GetFileResult" type="s:base64Binary"/>
    </s:sequence>
    </s:complexType>
</s:element>

使用wsdl2objc生成的代码,启用了guard malloc时出错:

  

GuardMalloc [eBridge-1115]:守卫   malloc区域失败:释放指针   我们没有分配那不是   任何注册地区声称的   GuardMalloc [eBridge-1115]:明确地说   陷入调试器!!!

这是我在看到它之前可以看到的最后一个obj-c代码:

@implementation WebServices_GetFileResponse
- (void)dealloc
{
    [soapSigner release];
    //breaks on the line below
    if(GetFileResult != nil) [GetFileResult release];

    [super dealloc];
}

我相信它在生成的Response对象的 deserializeElementsFromNode 中有所突破,但尚未确定它。这不是“为我调试程序”的问题。我的问题很简单 - 有没有人用wsdl2objc生成的base64Binary字节数组返回类型遇到这个问题?

更新


我认为的问题在于

+ (id)dateWithBase64EncodedString;

在NSData(MBBase64)中 -

char *data = malloc(...);
NSUInteger length = 0;

... // fill data[length++];

realloc(data, length);
return [NSData dataWithBytesNoCopy:bytes length:length]; //offending line?

我假设这不会使objective-c运行时声明内存..因此,当我发布NSData时,它仍以某种方式仍然使用'malloc'进行分配。有没有人比我知道的更好?

1 个答案:

答案 0 :(得分:2)

在+(id)dateWithBase64EncodedString中我将最后一行改为:

return [NSData dataWithBytesNoCopy:bytes length:length **freeWhenDone:NO**];

它似乎有效。这只是我的黑客攻击,但如果你是wsdl2objc的作者,希望这会有所帮助。