Управление памятью присваивается без выделения напрямую - PullRequest
0 голосов
/ 27 октября 2011

Предположим, что у меня UIView viewLoading объявлен в .h.и я не инициализирую его напрямую (в первом коде).

Первый код.

 UIView *viewLoading2 = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]];
 viewLoading = viewLoading2;
 [viewLoading2 release]

Второй код:

viewLoading = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]];

Третий код:

- (void) viewLoad:(UIView *) viewLoading2
{
  viewLoading = viewLoading2;
  //do i need to retain, alloc, or release something here?

}
  1. 2В первом коде мне нужно освободить viewLoading в dealloc?И что произойдет, если я не объявлю его свойство?

  2. Во втором коде, имеет ли он тот же эффект от первого кода?(нужно освободить или нет).

  3. Для третьего кода это имеет тот же эффект от первого кода?и что я должен делать после того, как я это код?(см. комментарий)

  4. Всегда ли в коде iPhone должен быть выпуск для переменной, объявленной в .h?Или только если переменная объявлена ​​в .h?если, как в первом коде, нужно ли делать dealloc viewLoading?

  5. в чем разница между

    self.viewloading = viewLoading2;

и

viewloading = viewLoading2; 

Спасибо

1 Ответ

3 голосов
/ 27 октября 2011

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

Во втором случае вы еще не выпустили viewLoading, так что в конце концов это нужно сделать.

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

Edit:

Я не уверен, что понимаю ваш вопрос 4. Объявление в файле интерфейса (.h) просто резервирует место для указателя. Это не объявление объекта, поэтому выпуск не требуется, пока вы на самом деле не сделаете выделение объекта.

self.viewloading = viewLoading2 использует метод установки свойств для выполнения назначения. Если в операторе @property есть «retain», то сохранение выполняется как часть этого присваивания. `viewloading = viewLoading2" - прямое назначение, без сохранения.

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