Объект существует после выпуска - PullRequest
0 голосов
/ 14 октября 2011

Может кто-нибудь объяснить мне, почему объект класса все еще существует после выпуска.Вот код

#import <Foundation/Foundation.h>
#import "MyClass.h"
int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyClass *class = [[MyClass alloc] init];

    NSLog(@"%@", [class showMouse]);
    NSLog(@"%@", [class printKbd]);

    [class release];

    NSLog(@"%@", [class printKbd]);
    //still exist

    [pool drain];
    return 0;
}

1 Ответ

2 голосов
/ 14 октября 2011

На самом деле, dealloc вызывается , вы можете проверить это, добавив NSLog(@"dealloc called") в dealloc метод MyClass.

Почему он все еще работает тогда?Когда объект освобождается, память не обнуляется, она просто помечается как свободная для использования системой.В результате код все еще может существовать по адресу указателя, а *class является просто указателем на блок памяти. Вот отличный ответ SO, который объясняет его в деталях .

Важно отметить, что, если выполнение программы длится дольше, вызов [class printKbd] скорее всего завершится сбоем.Вот почему важно присвоить nil указателю, просто чтобы убедиться, что мы не получим доступ к неопределенной части памяти.

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