Подтвердить что ты не робот

Должен ли я быть захвачен как сильный в обработчике 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?

4b9b3361

Ответ 1

Ключевой вопрос, который вы зададите себе, - это то, что ваш объект оповещения "принадлежит". В этом случае это не так (потому что вы объявили let alert = ... в теле функции). Таким образом, вам не нужно создавать это как слабую или неопубликованную ссылку.

Если оповещение было свойством "я", тогда оно было бы "принадлежало" самому себе, и именно тогда вы захотите создать слабую ссылку на себя в закрытии, "принадлежащем" предупреждением.