Неправильная ошибка декремента, проверка кода - PullRequest
1 голос
/ 05 октября 2011

Этот код ниже работает как положено, убирает вещи без зомби. Класс, в котором существует этот метод, является владельцем узлов, которые выпускаются, однако после «анализа» появляются следующие 2 проблемы.

Если возможно, не могли бы вы помочь мне понять, почему?

enter image description here

- (void) dealloc {  
    NSLog(@"Releasing [Doubly Linked List] .. ");

    Node *thisNode = [self firstNode]; 
    Node *nextNode = [thisNode next];

    while (nextNode != nil) {

        // If "Next node" is not nil, it means that
        //   "previous node" can now be released

        NSLog(@"    - releasing node \"%c\"", [[nextNode previous] charData]);
        [[nextNode previous] release];

        nextNode = [nextNode next];
    }

    [[self lastNode] release];
    [super dealloc];
}

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Проблема в том, что вы не выполняете действия в соответствии с обычными соглашениями об управлении памятью Objective C, и статический анализатор запутывается. По сути, класс Objective C, который выделяет объект, «владеет» объектом и отвечает за его освобождение. Здесь вы не используете эти соглашения, поэтому анализатор жалуется, даже если то, что вы делаете, работает правильно.

См. Документацию Apple для получения дополнительной информации о владении .

1 голос
/ 05 октября 2011

Нажмите на значок слева от сообщения, он покажет путь через код, который вызывает ошибку.

Вы выпускаете что-то, [nextNode previous], которое вам не принадлежит. В частности, вы не распределили, не сохранили и не получили его с помощью метода, который начинается с нового или копии, поэтому вы не имеете права собственности на него и не должны его выпускать.

Также очень редко можно выпустить что-то не в вашем классе, [[nextNode previous] release].

Сейчас: [[self lastNode] release];
Как и выше, вы не получили право собственности на объект, который вы отпускаете.

Если lastNode является свойством с удержанием, вы подрываете установщик, и когда позднее ему будет присвоено значение lastNode через установщик, произойдет дополнительная разблокировка объекта и, возможно, произойдет сбой. Если это снова не свойство, это очень нестандартно для освобождения чего-то, что возвращается вызовом метода.

Любые выпуски с кодом этой формы [[self lastNode] release] не являются стандартными, и если их избежать, будет меньше проблем с владением (удержанием / выпуском).

Вы сэкономите много времени и сил, изучив документацию по управлению памятью Apple.

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