Submit Search
Unowned / Weak References with Closure
2 likes
•
1,401 views
N
Naruki Chigira
変数の生存期間を playground を利用しながら確認していきます。
Technology
Read more
1 of 35
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
Iocage
Yuichiro Naito
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
1.
Naruki Chigira -
Timers inc. GitHub: naru-jpn, Twitter: @naruchigi Unowned / Weak References with Closure
2.
変数の生存期間、気にしてますか?
3.
クロージャ内で保持される変数、追えますか?
4.
DispatchQueue.main.async { [weak
self] in // ... }
5.
クロージャ内で『 とりあえず [weak
self] 』してませんか?
6.
Playground で挙動を細かく見てみよう https://gist.github.com/naru-jpn/fa4c39ce2eda8a803358dad75d04058d
7.
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
8.
class Object { var
child: Object? weak var weakChild: Object? var closure: (() -> ())? weak var currentExecutor: Executor? } 観測用クラス Object
9.
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? 変数が解放されているかどうかの確認
10.
object object if true
{ let object: Object = Object() weakObject = object // 1 } // 2 1. 変数はスコープを抜けたら解放される
11.
object child object child if true { let
object: Object = Object() object.child = object weakObject = object // 1 } // 2 weakObject?.child = nil 2. 参照によるメモリリーク
12.
object child object child if true { let
object: Object = Object() object.weakChild = object weakObject = object // 1 } // 2 weakObject?.child = nil 3. weak を使ってメモリリークしないようにしたケース
13.
循環参照は当然避けましょう
14.
object closure object closure if true { let
object: Object = Object() object.closure = { print("(object)") } weakObject = object // 1 } // 2 weakObject?.closure = nil 4. クロージャからの参照によるメモリリーク
15.
object closure object closure if true { let
object: Object = Object() object.closure = { [weak object] in print("(object)") } weakObject = object // 1 } // 2 5. [weak ---] を使ってメモリリークしないようにしたケース
16.
クロージャの循環参照にも注意
17.
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] を使う場合
18.
object closure object object closure object スコープ内 関数実行時
関数終了時 スコープ外 Executor Executor if true { let object: Object = Object() object.printWeakSelf() weakObject = object } 6. Executor のクロージャ内で [weak self] を使う場合
19.
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] を使わない場合
20.
object closure object object closure object Executor Executor スコープ内
関数実行時 関数終了時 スコープ外 if true { let object: Object = Object() object.printSelf() weakObject = object } 7. Executor のクロージャ内で [weak self] を使わない場合
21.
クロージャ内で self を参照してもリークしない場合もある
22.
非同期処理待機時 非同期処理終了時関数実行時 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] を使う場合
23.
非同期処理待機時 非同期処理終了時関数実行時 object closure closure Executor object closure Executor if
true { let object: Object = Object() object.printAsynchronousSelf() weakObject = object } sleep(UInt32(3.0)) 8. 非同期処理で [weak self] を使う場合
24.
非同期処理待機時 非同期処理終了時関数実行時 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] を使わない場合
25.
非同期処理待機時 非同期処理終了時関数実行時 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] を使わない場合
26.
非同期処理ではコールバック時に object が生存しているかどうかが変わってくる
27.
ただし、リークしないことに変わりはない
28.
目的に応じて使い分けられるようになりたいですね🤗
29.
いつか [weak self]
を見たときに思いを馳せてみてください
35.
Motivation / Concept https://developers.google.com/protocol-buffers/ Template message
Download