Хорошо, чтобы выпустить указатель, это ноль? - PullRequest
7 голосов
/ 01 октября 2009

Если я создаю новый объект, который включает в себя два указателя объекта (см. Ниже), когда объект создается, указатели устанавливаются равными нулю;

@interface rocketShip : NSObject {
    NSString *name; 
    NSNumber *thrust;
}

Если (по какой-то неожиданной причине) я не назначаю эти указатели, а позже освобождаю их в моем методе dealloc, это нормально, я уверен, что это так, просто хотел проверить?

- (void)dealloc{
    [name release];
    name = nil;
    [thrust release];
    thrust = nil;
    [super dealloc];
}

1007 * Гэри *

Ответы [ 4 ]

22 голосов
/ 01 октября 2009

Отправка сообщения на ноль не приведет к ошибке, так что это нормально. Вы должны убедиться, что указатели на самом деле равны нулю - отправка сообщения на указатель мусора, скорее всего, приведет к ошибкам.

7 голосов
/ 01 октября 2009

Да, вы можете сделать это, потому что вы можете безопасно отправить сообщение (например, release) на nil, и оно просто ничего не будет делать.

1 голос
/ 01 октября 2009

Если вы используете свойство accessor для создания ваших методов get / set:

@interface rocketShip : NSObject {
    NSString *name; 
    NSNumber *thrust;
}

@property (retain, nonatomic) NSString *name;
@property (retain, nonatomic) NSNumber *thrust;

А в вашем .m файле:

@synthesize name;
@synthesize thrust;

Затем вы можете просто установить переменную равной nil в dealloc. Это на самом деле вызовет ваш установщик и уменьшит счетчик ссылок на единицу и очистит все.

0 голосов
/ 01 октября 2009

В Objective-C важно различать объекты и переменные. Вы не можете освободить указатель (значение переменной), вы можете только освободить объект (объект, на который ссылается указатель). Нулевой указатель не ссылается на объект, поэтому сообщения, отправленные на ноль, ничего не делают (что обычно безопасно).

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