2015-03-06 2 views
0

Я пытаюсь изучить образец AVFoundation «AVCam». В примере проекта кода, AVCamViewController.m класс, есть реализация, как«__weak MyClass * myWeakClass = self», используя myWeakClass VS, используя self

__weak AVCamViewController *weakSelf = self; 
[self setRuntimeErrorHandlingObserver:[[NSNotificationCenter defaultCenter] addObserverForName:AVCaptureSessionRuntimeErrorNotification 
                          object:[self session] 
                          queue:nil 
                         usingBlock:^(NSNotification *note) { 
AVCamViewController *strongSelf = weakSelf; 

Мой вопрос, почему мы хотим сначала объявить указатель __weak, а затем назначить этот слабый указатель * strongSelf. Что бы разница, что если мы назначим «я» прямо
Что-то вроде:

AVCamViewController *strongSelf = self 

всего кода https://developer.apple.com/library/prerelease/ios/samplecode/AVCam/Listings/AVCam_AVCamViewController_m.html

+0

@jemmons объяснил в деталях: http://stackoverflow.com/a/20032131/846780 – Klevison

+0

Проверьте этот ответ, вы можете лучше понять http://stackoverflow.com/a/ 28876222/4631833 – Zahid

ответ

1

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

Вывод: проходя слабую ссылку в блок и assinging его сильную ссылку сохраняет объект на время выполнения блока и в то же время это не гарантирует, что не сохраняют циклы будут сделаны

1

Цели weakSelf является чтобы наблюдатель Центра уведомлений не содержал ссылки на AVCamViewController. Присутствие в блоке strongSelf заключается в том, чтобы избежать условий гонки, в которых AVCamViewController может быть освобожден в середине уведомления (при этом, если в момент уведомления было отправлено weakSelf, сохраните его на протяжении всей обработки уведомления, но если weakSelf не было, когда поступило уведомление, то strongSelf будет nil, тоже).

Этот процесс (иногда шуточный, называемый «слабый само-сильный танец») имеет решающее значение. Если у вас только есть strongSelf = self, вы повторно представили сильный ссылочный цикл (ранее известный как «цикл сохранения»), который описанный выше шаблон работал так усердно, чтобы его решить.