Почему метод Objective C все еще может быть вызван, когда объект был выпущен? - PullRequest
1 голос
/ 15 апреля 2011

Определение класса:

#import "MyClass.h"


@implementation MyClass

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (void)print
{
    NSLog(@"Hello World");

}

@end

И основной файл:

MyClass * m = [[MyClass alloc]init];
[m print];

[m release];

[m print];

Результат:

Hello World

Hello World

Почему 2-й метод все еще вызывается при освобождении объекта?

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Освобождение объекта просто помечает память, которую он использовал, как доступную для повторного использования для других целей.Он не перезаписывает его нулями или чем-то подобным.В вашем примере вы не создали никаких новых объектов, поэтому ничто не имело возможности повторно использовать память, ранее известную как «m».

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

[m release]
m = nil;
1 голос
/ 15 апреля 2011

Это потому, что память для этого объекта все еще находится на месте и еще не была перезаписана мусором. Кроме того, рассматриваемый метод не зависит от какой-либо другой (освобожденной) переменной экземпляра. Короче говоря, это просто шанс, что это сработало.

Попробуйте установить переменную среды NSZombieEnabled и запустите ее снова, чтобы увидеть, что вам действительно повезло.

0 голосов
/ 15 апреля 2011

Доступ к освобожденной памяти - неопределенное поведение.Когда вы вызываете неопределенное поведение, все может произойти.Это подпадает под заголовок «что угодно», поэтому вполне разумно, чтобы это произошло - например, доступ к неправильному объекту или просто сбой, что также является вероятным результатом.

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