SlideShare a Scribd company logo
Naruki Chigira - Timers inc.
GitHub: naru-jpn, Twitter: @naruchigi
Unowned / Weak References with Closure
変数の生存期間、気にしてますか?
クロージャ内で保持される変数、追えますか?
DispatchQueue.main.async { [weak self] in
// ...
}
クロージャ内で『 とりあえず [weak self] 』してませんか?
Playground で挙動を細かく見てみよう
https://gist.github.com/naru-jpn/fa4c39ce2eda8a803358dad75d04058d
class Executor {
// MARK: Exeute stored procedure
let procedure: () -> ()
init(procedure: @escaping () -> ()) {
self.procedure = procedure
}
func execute() {
self.procedure()
}
// MARK: Static execution
static func execute(procedure: () -> ()) {
procedure()
}
}
クロージャを実行するクラス Executor
class Object {
var child: Object?
weak var weakChild: Object?
var closure: (() -> ())?
weak var currentExecutor: Executor?
}
観測用クラス Object
weak var weakObject: Object? = nil
// スコープ内外での挙動を見るために if 文でネストさせる
// object が解放されていれば weakObject の中身は nil になる
if true {
let object: Object = Object()
weakObject = object
print(“(weakObject)") // nil or not nil?
}
print(“(weakObject)") // nil or not nil?
変数が解放されているかどうかの確認
object object
if true {
let object: Object = Object()
weakObject = object // 1
}
// 2
1. 変数はスコープを抜けたら解放される
object
child
object
child
if true {
let object: Object = Object()
object.child = object
weakObject = object // 1
}
// 2
weakObject?.child = nil
2. 参照によるメモリリーク
object
child
object
child
if true {
let object: Object = Object()
object.weakChild = object
weakObject = object // 1
}
// 2
weakObject?.child = nil
3. weak を使ってメモリリークしないようにしたケース
循環参照は当然避けましょう
object
closure
object
closure
if true {
let object: Object = Object()
object.closure = {
print("(object)")
}
weakObject = object // 1
}
// 2
weakObject?.closure = nil
4. クロージャからの参照によるメモリリーク
object
closure
object
closure
if true {
let object: Object = Object()
object.closure = { [weak object] in
print("(object)")
}
weakObject = object // 1
}
// 2
5. [weak ---] を使ってメモリリークしないようにしたケース
クロージャの循環参照にも注意
object
closure
object object
closure
object
スコープ内 関数実行時 関数終了時 スコープ外
Executor Executor
extension Object {
func printWeakSelf() {
let executor: Executor = Executor(procedure: { [weak self] in
debugPrint("(self)")
})
executor.execute()
}
}
6. Executor のクロージャ内で [weak self] を使う場合
object
closure
object object
closure
object
スコープ内 関数実行時 関数終了時 スコープ外
Executor Executor
if true {
let object: Object = Object()
object.printWeakSelf()
weakObject = object
}
6. Executor のクロージャ内で [weak self] を使う場合
object
closure
object object
closure
object
Executor Executor
スコープ内 関数実行時 関数終了時 スコープ外
extension Object {
func printSelf() {
let executor: Executor = Executor(procedure: {
print("(self)")
})
executor.execute()
}
}
7. Executor のクロージャ内で [weak self] を使わない場合
object
closure
object object
closure
object
Executor Executor
スコープ内 関数実行時 関数終了時 スコープ外
if true {
let object: Object = Object()
object.printSelf()
weakObject = object
}
7. Executor のクロージャ内で [weak self] を使わない場合
クロージャ内で self を参照してもリークしない場合もある
非同期処理待機時 非同期処理終了時関数実行時
object
closure closure
Executor
object
closure
Executor
extension Object {
func printAsynchronousWeakSelf() {
let executor: Executor = Executor(procedure: {
let time: DispatchTime = .now() + 1.0
DispatchQueue.global().asyncAfter(deadline: time, execute: { [weak self] in
print("(self)")
})
})
executor.execute()
self.currentExecutor = executor
}
}
8. 非同期処理で [weak self] を使う場合
非同期処理待機時 非同期処理終了時関数実行時
object
closure closure
Executor
object
closure
Executor
if true {
let object: Object = Object()
object.printAsynchronousSelf()
weakObject = object
}
sleep(UInt32(3.0))
8. 非同期処理で [weak self] を使う場合
非同期処理待機時 非同期処理終了時関数実行時
object
closure
object
closure
Executor
object
closure
Executor
extension Object {
func printAsynchronousSelf() {
let executor: Executor = Executor(procedure: {
DispatchQueue.global().asyncAfter(deadline: .now() + 1.0, execute: {
print("(self)")
})
})
executor.execute()
self.currentExecutor = executor
}
}
9. 非同期処理で [weak self] を使わない場合
非同期処理待機時 非同期処理終了時関数実行時
object
closure
object
closure
Executor
object
closure
Executor
if true {
let object: Object = Object()
object.printAsynchronousSelf()
weakObject = object
}
sleep(UInt32(3.0))
9. 非同期処理で [weak self] を使わない場合
非同期処理ではコールバック時に
object が生存しているかどうかが変わってくる
ただし、リークしないことに変わりはない
目的に応じて使い分けられるようになりたいですね🤗
いつか [weak self] を見たときに思いを馳せてみてください
Unowned / Weak References with Closure
Unowned / Weak References with Closure
Unowned / Weak References with Closure
Unowned / Weak References with Closure
Unowned / Weak References with Closure
Motivation / Concept
https://developers.google.com/protocol-buffers/
Template
message

More Related Content

What's hot (20)

PDF
テストを書こう、Unity編
Hiroto Imoto
 
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
 
PDF
ありえるえりあ勉強会@五反田~テスト編~ Part3
Tomoyuki Sato
 
PDF
About Jobs
Shinichi Kozake
 
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
 
PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
 
ODP
Iocage
Yuichiro Naito
 
PDF
Spock's world
Takuma Watabiki
 
PDF
Apache Auroraの始めかた
Masahito Zembutsu
 
PDF
Unity testtool
大介 束田
 
PDF
ICHIGEKI-MT 2015/03/14
Yasutaka Hamada
 
PDF
後期第三回ネットワークチーム講座資料
densan_teacher
 
PDF
scala-kaigi1-sbt
Kenji Yoshida
 
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
 
PDF
Spockの基礎
Kiyotaka Oku
 
PDF
Jbatch実践入門 #jdt2015
Norito Agetsuma
 
PPTX
async/await のしくみ
信之 岩永
 
PDF
JVMの中身を可視化してみた
Kengo Toda
 
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
 
PDF
Puppet on AWS
Sugawara Genki
 
テストを書こう、Unity編
Hiroto Imoto
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
Tomoyuki Sato
 
About Jobs
Shinichi Kozake
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
 
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
 
Spock's world
Takuma Watabiki
 
Apache Auroraの始めかた
Masahito Zembutsu
 
Unity testtool
大介 束田
 
ICHIGEKI-MT 2015/03/14
Yasutaka Hamada
 
後期第三回ネットワークチーム講座資料
densan_teacher
 
scala-kaigi1-sbt
Kenji Yoshida
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
 
Spockの基礎
Kiyotaka Oku
 
Jbatch実践入門 #jdt2015
Norito Agetsuma
 
async/await のしくみ
信之 岩永
 
JVMの中身を可視化してみた
Kengo Toda
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
 
Puppet on AWS
Sugawara Genki
 

Viewers also liked (7)

PPTX
Xcodeの管理を楽に - Jenkins編 -
Toshiyuki Hirata
 
PDF
Windows Azureを利用したDevOps入門
yoichi kikuta
 
PPTX
AWS Startup Tech - 宇宙と雲の間に CTO安川
SORACOM,INC
 
PDF
最強のセキュリティでIoTを実装する方法
Shinji Saito
 
PPTX
JAWS UG TOHOKU 秋田支部 | IoT 通信プラットフォーム SORACOM 仕組みとサービス& IoT 最新事例
SORACOM,INC
 
PPTX
日経ITpro EXPO2015 ソラコム特別講演: IoTのキャズムを超える by CEO玉川
SORACOM,INC
 
PPTX
SORACOM Dev Conf #0: 新機能発表!
SORACOM,INC
 
Xcodeの管理を楽に - Jenkins編 -
Toshiyuki Hirata
 
Windows Azureを利用したDevOps入門
yoichi kikuta
 
AWS Startup Tech - 宇宙と雲の間に CTO安川
SORACOM,INC
 
最強のセキュリティでIoTを実装する方法
Shinji Saito
 
JAWS UG TOHOKU 秋田支部 | IoT 通信プラットフォーム SORACOM 仕組みとサービス& IoT 最新事例
SORACOM,INC
 
日経ITpro EXPO2015 ソラコム特別講演: IoTのキャズムを超える by CEO玉川
SORACOM,INC
 
SORACOM Dev Conf #0: 新機能発表!
SORACOM,INC
 
Ad

Similar to Unowned / Weak References with Closure (9)

PDF
Objective-Cのメモリ管理
susan335
 
PDF
lazy var の特徴を知る #cocoa_kansai #cswift
Tomohiro Kumagai
 
PDF
Active Object
y-uti
 
PDF
Project Loom + Project Panama
Yuichi Sakuraba
 
PDF
Objective-C atomicity #idevjp
Tomohiro Kumagai
 
PPTX
Reactive Programming
maruyama097
 
KEY
Actor&stm
潤一 加藤
 
PPTX
Flux with RxSwift
Yuji Hato
 
PDF
Swift 2.0 で変わったところ「前編」 #cswift
Tomohiro Kumagai
 
Objective-Cのメモリ管理
susan335
 
lazy var の特徴を知る #cocoa_kansai #cswift
Tomohiro Kumagai
 
Active Object
y-uti
 
Project Loom + Project Panama
Yuichi Sakuraba
 
Objective-C atomicity #idevjp
Tomohiro Kumagai
 
Reactive Programming
maruyama097
 
Actor&stm
潤一 加藤
 
Flux with RxSwift
Yuji Hato
 
Swift 2.0 で変わったところ「前編」 #cswift
Tomohiro Kumagai
 
Ad

Recently uploaded (9)

PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 

Unowned / Weak References with Closure