Objective-C - указатель не ноль после уничтожения объекта - PullRequest
0 голосов
/ 06 июня 2011

Я немного играю на своем Linux с Objective-C.На самом деле, я пытаюсь выучить его, и во время работы над этим квестом я застрял.

Вот код:

#import <stdio.h>
#import <Foundation/NSObject.h>


int main(void) {

    NSObject *a = [[NSObject alloc] init];

    printf("Class retain count: %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n\n", (a==nil));

    [a retain]; 

    printf("Class retain count: %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n\n", (a==nil));

    [a release];

    printf("Class retain count: %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n\n", (a==nil));

    [a release];

    //printf("Class retain count:   %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n", (a==nil));


    return 0;
}

И это вывод:

Количество сохраняемых классов: 1

Значение указателя равно нулю: 0

Количество сохраненных классов: 2

Значение указателя равно нулю: 0

Класссохранить счет: 1

Указатель ноль: 0

Указатель ноль: 0

Я закомментировал последний printf, потому что он вылетает из программы (я получаю«Ошибка сегментации obj / test», потому что a не установлен в ноль ...).Так что я делаю не так?Почему указатель не установлен на ноль?Он просто сохраняет свое старое значение (до удаления объекта) ...

Ответы [ 4 ]

3 голосов
/ 06 июня 2011

освобождение объекта не установит его в ноль.release освободит объект, на который указывает ваша переменная (в данном случае a), однако ваша переменная все еще указывает на тот же адрес памяти объекта, если вы не назначите другой адрес, такой как:

a = otherAddress;

обычновы сделаете:

a = nil; //or
a = [[NSObject alloc] init]; //or
a = [MyObject objectWithSomething:smthg];

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

3 голосов
/ 06 июня 2011

Почему для указателя не установлено значение nil?

Поскольку указатели на объекты Objective-C являются просто указателями.Когда вы free памяти в простом C, вы не ожидаете, что ваши указатели будут установлены в NULL.

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

Вам придется явно set the variable nil после его освобождения.

[a release];
//This below line say : i don't have need to use the variable anymore. 
a = nil ;

, если вы не используете переменную , затем сначала release иустановите это значение nil.(Настройка nil необходима).

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

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

Вот почему вы не можете использовать obj == nil для проверкидействителен ли объект.

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