NSData dataWithBytesNoCopy запускает guardMalloc при освобождении - PullRequest
2 голосов
/ 21 июня 2011

Пожалуйста, смотрите обновление ниже

<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 , но еще не определили его. Это не вопрос «Отладка моей программы для меня». У меня вопрос просто - кто-нибудь сталкивался с этой проблемой с возвращаемым типом массива байтов base64Binary, сгенерированным wsdl2objc?

Обновление


Проблема, в которую я верю, заключается в

+ (id)dateWithBase64EncodedString;

в NSData (MBBase64) -

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

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

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

Я делаю предположение, что это не заставляет время выполнения target-c требовать память .. поэтому, когда я освобождаю NSData, он каким-то образом все еще выделяется с помощью 'malloc'. Кто-нибудь знает лучше меня?

1 Ответ

2 голосов
/ 21 июня 2011

In + (id) dateWithBase64EncodedString Я изменил последнюю строку на:

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

, и это, похоже, работает.Это всего лишь мой взлом, но если вы автор wsdl2objc, то, надеюсь, это поможет.

...