Должен ли я быть захвачен как сильный в обработчике UIAlertAction?
При записи handler
закрытия UIAlertAction
, если ссылка на self
будет сильной (по умолчанию), weak
или unowned
?
Были сообщения, относящиеся к этой теме (1, 2, 3, 4), но я честно не понимаю, как они помогут в этом случае.
Сфокусируйтесь на этом типичном коде:
func tappedQuitButton() {
let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet)
let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(quitAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(cancelAction)
presentViewController(alert, animated: true, completion: nil)
}
Это функция внутри подкласса UIViewController
, поэтому self
- это контроллер представления, представляющий предупреждение.
documentation говорит:
Используйте слабую ссылку, чтобы избежать ссылочных циклов, когда это возможно для того, чтобы эта ссылка имела "нет значения" в какой-то момент своей жизни. Если ссылка всегда будет иметь значение, используйте вместо этого ссылку, отличную от нее.
Я могу быть слепым, но я до сих пор не вижу, как это помогает ответить на мой вопрос о UIAlertAction
.
В приведенном выше коде возможно ли, чтобы self
было нулевым в какой-то момент его жизни? Да. Поэтому я должен отмечать self
как weak
.
Но опять же, я не могу придумать правдоподобный сценарий, когда self
будет nil, когда будет вызвано замыкание. Что касается этого замыкания, self
всегда будет иметь значение. Поэтому я должен отмечать self
как unowned
.
Итак, опять же, как self
быть захвачен в обработчике UIAlertAction?
Ответы
Ответ 1
Ключевой вопрос, который вы зададите себе, - это то, что ваш объект оповещения "принадлежит". В этом случае это не так (потому что вы объявили let alert = ...
в теле функции). Таким образом, вам не нужно создавать это как слабую или неопубликованную ссылку.
Если оповещение было свойством "я", тогда оно было бы "принадлежало" самому себе, и именно тогда вы захотите создать слабую ссылку на себя в закрытии, "принадлежащем" предупреждением.