Неверный тип получателя при освобождении переменной - PullRequest
0 голосов
/ 13 мая 2011

Я многое узнал об управлении памятью, но одна эта проблема заставляет меня задуматься.

В методе класса я создаю переменную:

TBXMLElement *pieceXML = [TBXML childElementNamed:@"piece" 
                                parentElement:rootElement];

И освобождаю ее в концеметода:

[pieceXML release];

Но я получаю ошибку: Invalid receiver type 'TBXMLElement *'

Реализация childElementNamed:parentElement: ниже

+ (TBXMLElement*) childElementNamed:(NSString*)aName parentElement:(TBXMLElement*)aParentXMLElement{
    TBXMLElement * xmlElement = aParentXMLElement->firstChild;
    const char * name = [aName cStringUsingEncoding:NSUTF8StringEncoding];
    while (xmlElement) {
        if (strlen(xmlElement->name) == strlen(name) && memcmp(xmlElement->name,name,strlen(name)) == 0) {
            return xmlElement;
        }
        xmlElement = xmlElement->nextSibling;
    }
    return nil;
}

Я пытаюсь понятькак я могу предсказать, что это произойдет снова, и любые ссылки на чтение приветствуются, поскольку я не уверен, как найти причину этого даже после просмотра.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

TBXMLElement не является классом Objective-C - вместо этого это C struct.

Это означает, что pieceXML не является объектом Objective-C, поэтому вы не можете отправить ему какой-либо Objective-С сообщениями.В частности, вы не можете отправить его -release.

1 голос
/ 13 мая 2011

Вам не нужно освобождать объекты, полученные из вспомогательных методов, таких как childElementNamed:parentElement: Выпускать только тогда, когда вы выделяете или копируете.Есть несколько исключений, но это практическое правило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...