Должен ли я написать этот релиз? - PullRequest
0 голосов
/ 16 февраля 2011

- example.h -

@property ( copy ) NSString *string;
@property ( retain ) Object *object;

-- example.m --
( void ) do {
    // I have used 'string' and 'object' using their setter method several times.
}

( void ) dealloc {
    [ string release ]; // Should I write this code?
    [ object release ]; // Should I write this code?
}

Они не использовали alloc, copy, new. Но они указывают последние объекты, которые были сделаны в их методе установки и не выпущены Я действительно хочу знать об этих ситуациях, хотя это не очень важно.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

Вы не @synthesize эти @property с, поэтому ваш код не будет работать. - Добавить директиву @synthesize, например, так:

@synthesize string, object;

Да, выв этом случае следует отправить им сообщение release в -dealloc, поскольку вы используете copy и retain, которые оба получают право собственности на получателя.

- (void) dealloc {
   [string release];
   [object release];
   [super dealloc];
}

ТАКЖЕНЕ ЗАБЫВАЙТЕ ПРИЗЫВАТЬ [super dealloc] НА НИЖЕ ВАШЕГО -dealloc МЕТОДА !!

1 голос
/ 16 февраля 2011

да, вы должны выпустить оба в этом примере.

0 голосов
/ 16 февраля 2011

Поскольку вы @synthesized свои свойства, помните, что присвоение свойства nil освободит его для вас, и гарантируют, что код не сможет продолжать его использовать.

- (void) dealloc {
  string = nil;
  object = nil;
  [super dealloc];
}

Если у вас были переменные экземпляра (iVars), тогда вы должны использовать release, так как нет средства доступа к установщику, которое выпустило бы его для вас.

0 голосов
/ 16 февраля 2011

Да, потому что ваш NSString *string является copy свойством, а ваш NSObject *object является retain свойством.Используя их установщики, ваш экземпляр копирует и сохраняет объекты, которые вы назначаете им соответственно.

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