Безопасно ли вызывать инициализаторы несколько раз для одного и того же «выделенного» объекта? - PullRequest
5 голосов
/ 11 ноября 2010

Я могу построить UIImageView объект с myImageView = [[UIImageView alloc] initWithImage:image];

После действия приложения, влияющего на отображение, если я хочу изменить изображение в UIImageView.Я могу сделать это, переназначив его с myImageView.image = someNewImage.Однако, похоже, это не обновляет размеры кадра.Я могу изменить их вручную, но на практике я заметил, что вызов [myImageView initWithImage:someNewImage] делает это для меня и имеет преимущество в том, что он более краткий.

Однако я не уверен, является ли это официальным нарушением протокола в ObjectiveC, чтобы сделать несколько вызовов init методов для объекта, созданного одним alloc .Я бы не использовал его, если бы он не был безопасным (гарантированно, чтобы не разбиться или не вызвать утечки).Есть ли доказательства того, что это небезопасно?

Мои исследования до сих пор ...

В этой статье приводятся общие сведения о 'alloc' и 'init' для объектов

http://developer.apple.com/library/mac/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html

Это связанный вопрос SO

Почему alloc и init вызываются отдельно в Objective-C?

Эта статья в блоге предупреждает поставщиков объектов, которые их методы init могут вызывать несколько раз в качестве эффекта процесса инициализации.

http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/

Ответы [ 2 ]

7 голосов
/ 11 ноября 2010

номер

-init написано при условии, что он вызывается только один раз. Например, -initWithImage в цитируемой вами документации Apple реализовано как

- (id)initWithImage:(NSImage *)anImage {
  ...
  if (self) {
      image = [anImage retain];
  }
  return self;
}

Предполагается, что ивар image не указывает на удерживаемый объект. При вызове дважды происходит утечка image.

Звоните -init... только один раз за alloc и вызывайте -init... сразу после alloc, комбинируя их как обычно:

SomeClass* foo=[[SomeClass alloc] init...: ... ];

Вы никогда не должны разделять их, потому что [anAllocedObject init...] может вернуть что-то отличное от anAllocedObject.

1 голос
/ 11 ноября 2010

Нет, init (или один из его вариантов) должен вызываться только один раз для любого объекта, как объяснил Юджи.Что касается вашей проблемы UIImageView, я полагаю, что вы можете просто позвонить [imageView sizeToFit] после назначения нового изображения, и оно автоматически изменит его для вас.

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