Submit Search
Upload
Unowned / Weak References with Closure
•
2 likes
•
1,391 views
N
Naruki Chigira
Follow
変数の生存期間を playground を利用しながら確認していきます。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 35
Download now
Download to read offline
Recommended
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
Hisateru Tanaka
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
bitter_fox
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
Koichi Sakata
xUnit Test Patterns - Chapter11
xUnit Test Patterns - Chapter11
Takuto Wada
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
Takahiro Yoshimura
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
Recommended
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
Hisateru Tanaka
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
bitter_fox
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
Koichi Sakata
xUnit Test Patterns - Chapter11
xUnit Test Patterns - Chapter11
Takuto Wada
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
Takahiro Yoshimura
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
テストを書こう、Unity編
テストを書こう、Unity編
Hiroto Imoto
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3
Tomoyuki Sato
About Jobs
About Jobs
Shinichi Kozake
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
Iocage
Iocage
Yuichiro Naito
Spock's world
Spock's world
Takuma Watabiki
Apache Auroraの始めかた
Apache Auroraの始めかた
Masahito Zembutsu
Unity testtool
Unity testtool
大介 束田
ICHIGEKI-MT 2015/03/14
ICHIGEKI-MT 2015/03/14
Yasutaka Hamada
後期第三回ネットワークチーム講座資料
後期第三回ネットワークチーム講座資料
densan_teacher
scala-kaigi1-sbt
scala-kaigi1-sbt
Kenji Yoshida
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
Spockの基礎
Spockの基礎
Kiyotaka Oku
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
Norito Agetsuma
async/await のしくみ
async/await のしくみ
信之 岩永
JVMの中身を可視化してみた
JVMの中身を可視化してみた
Kengo Toda
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
Puppet on AWS
Puppet on AWS
Sugawara Genki
Xcodeの管理を楽に - Jenkins編 -
Xcodeの管理を楽に - Jenkins編 -
Toshiyuki Hirata
Windows Azureを利用したDevOps入門
Windows Azureを利用したDevOps入門
yoichi kikuta
More Related Content
What's hot
テストを書こう、Unity編
テストを書こう、Unity編
Hiroto Imoto
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3
Tomoyuki Sato
About Jobs
About Jobs
Shinichi Kozake
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
Iocage
Iocage
Yuichiro Naito
Spock's world
Spock's world
Takuma Watabiki
Apache Auroraの始めかた
Apache Auroraの始めかた
Masahito Zembutsu
Unity testtool
Unity testtool
大介 束田
ICHIGEKI-MT 2015/03/14
ICHIGEKI-MT 2015/03/14
Yasutaka Hamada
後期第三回ネットワークチーム講座資料
後期第三回ネットワークチーム講座資料
densan_teacher
scala-kaigi1-sbt
scala-kaigi1-sbt
Kenji Yoshida
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
Spockの基礎
Spockの基礎
Kiyotaka Oku
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
Norito Agetsuma
async/await のしくみ
async/await のしくみ
信之 岩永
JVMの中身を可視化してみた
JVMの中身を可視化してみた
Kengo Toda
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
Puppet on AWS
Puppet on AWS
Sugawara Genki
What's hot
(20)
テストを書こう、Unity編
テストを書こう、Unity編
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3
About Jobs
About Jobs
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Iocage
Iocage
Spock's world
Spock's world
Apache Auroraの始めかた
Apache Auroraの始めかた
Unity testtool
Unity testtool
ICHIGEKI-MT 2015/03/14
ICHIGEKI-MT 2015/03/14
後期第三回ネットワークチーム講座資料
後期第三回ネットワークチーム講座資料
scala-kaigi1-sbt
scala-kaigi1-sbt
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Spockの基礎
Spockの基礎
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
async/await のしくみ
async/await のしくみ
JVMの中身を可視化してみた
JVMの中身を可視化してみた
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
Puppet on AWS
Puppet on AWS
Viewers also liked
Xcodeの管理を楽に - Jenkins編 -
Xcodeの管理を楽に - Jenkins編 -
Toshiyuki Hirata
Windows Azureを利用したDevOps入門
Windows Azureを利用したDevOps入門
yoichi kikuta
AWS Startup Tech - 宇宙と雲の間に CTO安川
AWS Startup Tech - 宇宙と雲の間に CTO安川
SORACOM,INC
最強のセキュリティでIoTを実装する方法
最強のセキュリティでIoTを実装する方法
Shinji Saito
JAWS UG TOHOKU 秋田支部 | IoT 通信プラットフォーム SORACOM 仕組みとサービス& IoT 最新事例
JAWS UG TOHOKU 秋田支部 | IoT 通信プラットフォーム SORACOM 仕組みとサービス& IoT 最新事例
SORACOM,INC
日経ITpro EXPO2015 ソラコム特別講演: IoTのキャズムを超える by CEO玉川
日経ITpro EXPO2015 ソラコム特別講演: IoTのキャズムを超える by CEO玉川
SORACOM,INC
SORACOM Dev Conf #0: 新機能発表!
SORACOM Dev Conf #0: 新機能発表!
SORACOM,INC
Viewers also liked
(7)
Xcodeの管理を楽に - Jenkins編 -
Xcodeの管理を楽に - Jenkins編 -
Windows Azureを利用したDevOps入門
Windows Azureを利用したDevOps入門
AWS Startup Tech - 宇宙と雲の間に CTO安川
AWS Startup Tech - 宇宙と雲の間に CTO安川
最強のセキュリティでIoTを実装する方法
最強のセキュリティでIoTを実装する方法
JAWS UG TOHOKU 秋田支部 | IoT 通信プラットフォーム SORACOM 仕組みとサービス& IoT 最新事例
JAWS UG TOHOKU 秋田支部 | IoT 通信プラットフォーム SORACOM 仕組みとサービス& IoT 最新事例
日経ITpro EXPO2015 ソラコム特別講演: IoTのキャズムを超える by CEO玉川
日経ITpro EXPO2015 ソラコム特別講演: IoTのキャズムを超える by CEO玉川
SORACOM Dev Conf #0: 新機能発表!
SORACOM Dev Conf #0: 新機能発表!
Similar to Unowned / Weak References with Closure
React Native GUIDE
React Native GUIDE
dcubeio
Kanazawa.js.Next
Kanazawa.js.Next
dynamis
JavaScript入門
JavaScript入門
Ryo Maruyama
Active Object
Active Object
y-uti
Composable Callbacks & Listeners
Composable Callbacks & Listeners
Taisuke Oe
Scope Exit
Scope Exit
Akira Takahashi
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
株式会社ランチェスター
ClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
Dakota+openFoam1
Dakota+openFoam1
守淑 田村
Leiningen超速入門
Leiningen超速入門
Kiyotaka Kunihira
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Yoshimasa Tanabe
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
Yuta Kawadai
今日からはじめるGPars
今日からはじめるGPars
fumokmm
仕事でも Groovy を使おう!
仕事でも Groovy を使おう!
Oda Shinsuke
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
Kazuhiro Sera
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
Async awaitでの繰り返し処理についての小話
Async awaitでの繰り返し処理についての小話
Masakazu Muraoka
SPL fukuokaphp_1
SPL fukuokaphp_1
ichikaway
JavaScript基礎勉強会
JavaScript基礎勉強会
大樹 小倉
Similar to Unowned / Weak References with Closure
(20)
React Native GUIDE
React Native GUIDE
Kanazawa.js.Next
Kanazawa.js.Next
JavaScript入門
JavaScript入門
Active Object
Active Object
Composable Callbacks & Listeners
Composable Callbacks & Listeners
Scope Exit
Scope Exit
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ClassLoader Leak Patterns
ClassLoader Leak Patterns
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Dakota+openFoam1
Dakota+openFoam1
Leiningen超速入門
Leiningen超速入門
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
今日からはじめるGPars
今日からはじめるGPars
仕事でも Groovy を使おう!
仕事でも Groovy を使おう!
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
MoteMote Compiler Plugin
MoteMote Compiler Plugin
Async awaitでの繰り返し処理についての小話
Async awaitでの繰り返し処理についての小話
SPL fukuokaphp_1
SPL fukuokaphp_1
JavaScript基礎勉強会
JavaScript基礎勉強会
Recently uploaded
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
Recently uploaded
(9)
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
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]
を見たときに思いを馳せてみてください
30.
31.
32.
33.
34.
35.
Motivation / Concept https://developers.google.com/protocol-buffers/ Template message
Download now