2015-07-16 2 views
5

В Objective-C в нетривиальных блоках я заметил использование weakSelf/strongSelf.Каков правильный способ использования strongSelf в swift?

Каков правильный способ использования strongSelf в Swift? Что-то вроде:

if let strongSelf = self { 
    strongSelf.doSomething() 
} 

Таким образом, для каждой строки, содержащей себя в закрытии я должен добавить strongSelf проверить?

if let strongSelf = self { 
    strongSelf.doSomething1() 
} 

if let strongSelf = self { 
    strongSelf.doSomething2() 
} 

Есть ли способ сделать вышеупомянутый более элегантным?

+0

Там нет ничего особенного 'strongSelf' здесь. Это просто имя переменной. Возможно, добавьте код Objective-C, который вы хотите воспроизвести? То, что вы здесь делаете, ничем не отличается от просто 'self? .doSomething()' – nhgrif

+0

Пожалуйста, проверьте этот вопрос: '' [unowned self] 'в swift: http://stackoverflow.com/questions/24320347/shall-we -всегда - использовать-не-самостоятельно-внутри-закрытие-в-быстрой и https://dhoerl.wordpress.com/2013/04/23/-finally-figured-out-weakself-and-strongself/ –

ответ

15

Использование strongSelf - это способ проверить, что self не равен нулю. Когда у вас есть замыкание, которое может быть вызвано в какой-то момент в будущем, важно передать экземпляр self weak, чтобы вы не создавали цикл сохранения, удерживая ссылки на объекты, которые были деинициализированы.

{[weak self]() -> void in 
     if let strongSelf = self { 
     strongSelf.doSomething1() 
     } 
} 

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

+0

Ясный объяснение. –

1

Если вы используете self в своем закрытии, он автоматически используется как сильный.

Существует также способ использования в качестве weak или unowned, если вы пытаетесь избежать циклов удержания. Это достигается путем передачи [незанятого себя] или [слабого себя] перед параметрами закрытия.

2

Ваше использование strongSelf похоже направлено на вызов метода doSomethingN(), если self не равен нулю. Вместо этого, используйте дополнительный вызов метода в качестве предпочтительного подхода:

self?.doSomethingN() 
2

другой способ использовать weak self без использования strongSelf

{[weak self]() -> void in 
     guard let `self` = self else { return } 
     self.doSomething() 
} 
+5

Мне это нравится, но будьте осторожны. Крис Лэттнер специально заявил, что это ошибка компилятора https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html – wuf810

Смежные вопросы