Нужно ли мне установить эти переменные в ноль в viewDidLoad, как в этом коде? - PullRequest
3 голосов
/ 11 июля 2009
- (void)viewDidUnload {
  self.GPSArray = nil;
  self.accelerometerArray = nil;
  self.headingArray = nil;
  self.managedObjectContext = nil;
  self.locationManager = nil;
  self.pointLabel = nil;
  self.accelerometerLabel= nil;
  self.headingLabel= nil;
  self.startStop = nil;
  self.lastAccelerometerReading = nil;
  self.lastGPSReading = nil;
  self.lastHeadingReading = nil;
}


- (void)dealloc {
  [GPSArray release];
  [accelerometerArray release];
  [headingArray release];
  [managedObjectContext release];
  [locationManager release];
  [pointLabel release];
  [accelerometerLabel release];
  [headingLabel release];
  [startStop release];
  [lastAccelerometerReading release];
  [lastGPSReading release];
  [lastHeadingReading release];
  [super dealloc];  
}

Ответы [ 3 ]

2 голосов
/ 11 июля 2009

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

Итак, вам нужно только бесплатно просмотреть связанные предметы.

В вашем случае, похоже, вам нужно только освободить UILabels, которые, вероятно, на ваш взгляд. Если они были помечены как IBOutlets, а не в назначенных свойствах, вы бы хотели освободить используемую ими память:

self.pointLabel = nil;
self.accelerometerLabel= nil;
self.headingLabel= nil;

Это также означает, что в viewDidLoad, если вы настраиваете другие свойства, вы хотите удостовериться, что они не выделяются снова, если они уже есть, так как его можно вызвать снова, если представление выгружено, а затем снова загружено.

Причина, по которой это будет вызвано, заключается в том, что контроллер представления получил предупреждение памяти. Вы можете проверить это предупреждение о памяти в симуляторе, чтобы увидеть, как вызываются viewDidUnload и viewDidLoad.

0 голосов
/ 11 июля 2009

нет, не стоит.

если вы делаете так, как будто приведенный выше код, вы тратите впустую усилия.

Установив для них значение nil в viewDidUnload, они будут проходить через процесс выпуска и сохраняться автоматически, что означает, что к тому времени, когда код поступит в dealloc, они фактически будут освобождены и равны нулю, и вы делаете еще один выпуск для ноля. Освобождение нулевого объекта может быть ошибочным.

Итак, игнорируйте те, что в viewDidUnload.

0 голосов
/ 11 июля 2009

Вам не нужно, и если вы запустите это, вы потратите некоторое время на выполнение. Использование метода свойства для присвоения свойству nil - это то же самое, что и освобождение свойства с оговоркой, что некоторые дополнительные вещи могут или не могут произойти, в зависимости от того, как вы установили методы установки.

Итак, давайте пройдемся по этому коду. В конце вашего метода viewDidUnload все ваши свойства теперь равны нулю. Затем объект освобождается, и ваш объект пытается выпустить дюжину объектов nil или около того. Теперь среда выполнения Objective-C довольно умная, и если вы отправите сообщение на ноль, (неожиданный сюрприз) ничего не произойдет.

Итак, у вас в основном дюжина строк, которые абсолютно ничего не делают.

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