Должен ли я использовать __unsafe_unretained для временных переменных? - PullRequest
3 голосов
/ 26 января 2012

Допустим, я хочу создать временную переменную, например ::100100

  1. Чтобы указать на другую долгоживущую переменную:

    __unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
    
  2. Чтобы указать на объект, который я только что создал.

    __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
    

Эти временные переменные не нужно хранить, потому что объекты, на которые они указывают, гарантированно сохраняют положительные значения хранения до тех пор, пока временные переменные находятся в области видимости. Итак, я должен объявить их как __unsafe_unretained?

Ответы [ 3 ]

5 голосов
/ 26 января 2012

Почему это важно, если система сохраняет вашу временную переменную?И на самом деле, вы действительно хотите сохранить его.

Рассмотрим:

__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView
self.tableView.tableHeaderView = nil;
NSLog(@"%@", tableHeaderView); //<-I WILL CRASH
2 голосов
/ 27 января 2012

Матовый,

Весь смысл ARC - позволить вам игнорировать подобные проблемы. Фактически, компилятор может даже не сохранять эти экземпляры.

Пусть ARC беспокоится об этих проблемах. Не пытайтесь помочь, пока не пожалуются компилятор или статический анализатор. (Кстати, вы позволяете анализатору работать с каждой компиляцией, верно? Он обнаруживает проблемы при их создании.)

Вам следует беспокоиться только об избыточном создании объектов в циклах и управлении созданием больших объектов. Первый обрабатывается путем разумного использования @autorelease. Вы по-прежнему управляете большими предметами, как и ante-ARC.

Andrew

1 голос
/ 26 января 2012

Нет. Если ARC сохранит его, он отпустит его, когда переменная выйдет из области видимости.

...