При записи 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?