Когда-либо имеет смысл звонить [init] за пределами [[выделение] init]?

Я задаюсь вопросом если [[alloc] init] просто конвенция или если разделение двух вызовов имеет более широкое использование. Например, интересно, звонят ли люди когда-нибудь [init] (или друзья) на существующем объекте "повторно инициализировать" его.

7
задан iter 2 May 2010 в 06:37
поделиться

4 ответа

Соглашение заключается в том, чтобы никогда не переинициализировать объекты. Вы можете делать это на крайне ограниченной основе в своих собственных классах, которые являются подклассами NSObject (или определяя новый корень), но вы никогда не должны делать этого с подклассами любого другого класса из системных фреймворков.

Если вы хотите "повторно использовать" экземпляры класса, то предоставьте методы для повторного использования помимо назначенного инициализатора. Например, вы можете сделать:

- (void) reset;

Или:

- (void) resetWithNewState: (MyState *) aState;
6
ответ дан 6 December 2019 в 12:47
поделиться

Это можно сделать, если память сильно ограничена (как в приложении iPhone), вы можете "выделить" один (или несколько) экземпляров, а затем использовать их повторно. Однако нужно быть осторожным с утечками, поскольку объекты, сохраняемые/создаваемые в init, часто освобождаются/освобождаются при сообщении 'free'.

2
ответ дан 6 December 2019 в 12:47
поделиться

По соглашению, единственное использование семейства init - это когда они вызывают друг друга. Например:

-(id) initWithSomething:(int)something {
  self = [super init];
  // use something
  return self;
}

-(id) init {
  return [self initWithSomething:3];
}

Вы можете передать зомби-объект, у которого init никогда не вызывался, но я не могу придумать веской причины для этого. Если вы хотите создать объект, не зная его типа, вы передаете ему Class.

-(id) makeAnything:(Class)someClass {
  return [[someClass alloc] init];
}

Edit:

alloc гарантирует, что все члены инициализированы нулем, и многие методы init полагаются на это. Вызов init более одного раза нарушает этот контракт.

5
ответ дан 6 December 2019 в 12:47
поделиться

Интересный вопрос. Лично я бы дважды подумал, прежде чем начать возиться с этим. Кажется, что это просто напрашивается на новый источник ошибок и при этом не приносит ничего нового, что нельзя было бы получить более безопасным способом. Возможно, я просто недостаточно понимаю, что происходит в alloc и init, чтобы играть с этими частями, но я обнаружил, что "тупой" код обычно делает меня счастливее (KISS).

3
ответ дан 6 December 2019 в 12:47
поделиться