SlideShare a Scribd company logo
1 of 32
Download to read offline
【朝活】
iOS開発会議
in beez渋谷
46回目
2016年1月14日
佐藤剛士
自己紹介
【名前】
佐藤剛士
【肩書】
コンセプトづくりから相談できるエンジニア。
【お仕事】
昨年10月に独立。
前は受託IT企業でインフラの保守運用業務
今は有限会社カイカイでiOSアプリ作成
【できること】
ruby,iOS,apatch,linux(サーバー周り),Twilio
【リリースアプリ】
YumeHoshi
SwiftのARC
(参照カウンタ)
Swiftの参照カウント(ARC)
Swiftではクラスのインスタンスは、Objective-Cと同
様、参照カウンタで管理されている。
インスタンスが生成されると参照カウント1になる
インスタンスの参照が増えるごとに参照カウンタも+1
減ると-1
参照カウントが0になるとインスタンスが破棄される
Swiftはデフォルトで強参照になる
クラスにある機能で、構造体、列挙型にはない
参照カウントの例
class Person {
let name : String
init(name : String){
self.name = name
print("(self.name)さんがやってきました")
}
deinit{
print("(self.name)さんはいなくなりました")
}
}
//佐藤さんが3人いる
var sato,sato2,sato3 : Person?
sato = Person(name: "佐藤")//参照カウント1
sato2 = sato//参照カウント2
sato3 = sato//参照カウント3
sato = nil//参照カウント2
sato2 = nil//参照カウント1
sato3 = nil//参照カウント0 ->satoインスタンス破棄
循環参照
関連のある複数のクラスのインスタンス同士をお互い
に強参照で保持した場合、循環参照となる。
メモリリーク(インスタンスが破棄されずに残ること)
となってしまう。
循環参照
/*ユーザークラス*/
class User {
let name : String
var haveDevice : AppleDevice?
init(name : String){
self.name = name
}
deinit{
print("(name)さんはいなくなりました")
}
}
/*アップルデバイスクラス*/
class AppleDevice {
let name : String
var user : User?
init(name : String){
self.name = name
}
deinit{
print("(self.user!.name)さんの持ち物ではなくなりました")
}
}
循環参照を実行
var tanaka : User?
var iPhone6s : AppleDevice?
tanaka = User(name: "田中")
iPhone6s = AppleDevice(name: "iPhone6s")
AppleDevice インスタンス
name: "iPhone6s"
user : nil
User インスタンス
name: "田中"
haveDevice : nil
var tanaka var iPhone6s
強参照 強参照
循環参照を実行
tanaka?.haveDevice = iPhone6s//プロパティに代入。
iPhone6s?.user = tanaka
AppleDevice インスタンス
name: "iPhone6s"
user : <User インスタンス>
User インスタンス
name: "田中"
haveDevice :
<AppleDeviceインスタンス>
var tanaka var iPhone6s
強参照 強参照
強参照
強参照
循環参照を実行
tanaka = nil
iPhone6s = nil//weakがないとiPhone6sが破棄されない
AppleDevice インスタンス
name: "iPhone6s"
user : <User インスタンス>
User インスタンス
name: "田中"
haveDevice :
<AppleDeviceインスタンス>
var tanaka var iPhone6s
強参照
強参照
メモリリーク!
循環参照を解決する
参照カウントを増やさないで参照する方法で循環参照を回
避する
弱参照(weak reference)
• 参照するインスタンスが後からnilになるうる場合に使用
する
アンオウンド参照(unowned reference)
• 一旦設定されたらその後nilになることがない(インスタ
ンスの存続期間が一方に、或はお互いに依存する)場合
循環参照を弱参照で解決
/*ユーザークラス*/
class User {
let name : String
weak var haveDevice : AppleDevice?//弱参照を指定
init(name : String){
self.name = name
}
deinit{
print("(name)さんはいなくなりました")
}
}
/*アップルデバイスクラス*/
class AppleDevice {
let name : String
var user : User?
init(name : String){
self.name = name
}
deinit{
print("(self.user!.name)さんの持ち物ではなくなりました")
}
}
実行
var tanaka : User?
var iPhone6s : AppleDevice?
tanaka = User(name: "田中")
iPhone6s = AppleDevice(name: "iPhone6s")
AppleDevice インスタンス
name: "iPhone6s"
user : nil
User インスタンス
name: "田中"
haveDevice : nil
var tanaka var iPhone6s
強参照 強参照
プロパティ設定
tanaka?.haveDevice = iPhone6s//プロパティに代入。
iPhone6s?.user = tanaka
AppleDevice インスタンス
name: "iPhone6s"
user : <User インスタンス>
User インスタンス
name: "田中"
haveDevice :
<AppleDeviceインスタンス>
var tanaka var iPhone6s
強参照 強参照
弱参照
強参照
田中さんを削除
tanaka = nil
AppleDevice インスタンス
name: "iPhone6s"
user : <User インスタンス>
User インスタンス
name: "田中"
haveDevice :
<AppleDeviceインスタンス>
var tanaka var iPhone6s
強参照
弱参照
強参照
iPhone6sを削除
iPhone6s = nil//weakがないとiPhone6sが破棄されない
AppleDevice インスタンス
name: "iPhone6s"
user : <User インスタンス>
User インスタンス
name: "田中"
haveDevice :
<AppleDeviceインスタンス>
var tanaka var iPhone6s
強参照
弱参照
AppDeviceインスタンス削除
iPhone6s = nil//weakがないとiPhone6sが破棄されない
AppleDevice インスタンス
name: "iPhone6s"
user : <User インスタンス>
User インスタンス
name: "田中"
haveDevice :
<AppleDeviceインスタンス>
var tanaka var iPhone6s
強参照
弱参照
Userインスタンス削除
iPhone6s = nil//weakがないとiPhone6sが破棄されない
AppleDevice インスタンス
name: "iPhone6s"
user : <User インスタンス>
User インスタンス
name: "田中"
haveDevice :
<AppleDeviceインスタンス>
var tanaka var iPhone6s
弱参照
循環参照をアンオウンド参照で解決
/*カスタマークラス*/
class Customer {
let name : String
var bankAccount : BankAccount?
init(name : String){
self.name = name
}
deinit{
print("(self.name)はいなくなりました")
}
}
/*銀行口座クラス*/
class BankAccount {
let number : Int
unowned let customer : Customer
init(number : Int, customer: Customer){
self.number = number
self.customer = customer
}
deinit{
print("銀行口座:(self.number)は解約されました")
}
}
実行
var takashi : Customer?
takashi = Customer(name: "タカシ")
takashi!.bankAccount = BankAccount(number: 12345678, customer: takashi!)//口座を開設する
BankAccount インスタンス
number: 12345678
customer : <Customer イ
ンスタンス>
Customer インスタンス
name: "タカシ"
bankAccount :
<BankAccountインスタンス>
var takashi
強参照
強参照
アンオウンド参照
タカシを削除
takashi = nil//unownedを指定していないと口座が解約されない
BankAccount インスタンス
number: 12345678
customer : <Customer イ
ンスタンス>
Customer インスタンス
name: "タカシ"
bankAccount :
<BankAccountインスタンス>
var takashi
強参照
アンオウンド参照
Customerインスタンスが削除
takashi = nil//unownedを指定していないと口座が解約されない
BankAccount インスタンス
number: 12345678
customer : <Customer イ
ンスタンス>
Customer インスタンス
name: "タカシ"
bankAccount :
<BankAccountインスタンス>
var takashi
強参照
アンオウンド参照
BankAccountインスタンスも削除
takashi = nil//unownedを指定していないと口座が解約されない
BankAccount インスタンス
number: 12345678
customer : <Customer イ
ンスタンス>
Customer インスタンス
name: "タカシ"
bankAccount :
<BankAccountインスタンス>
var takashi
アンオウンド参照
Swiftのクロージャーキャプチャリスト
• Swiftのクロージャーでも循環参照になることが
ある
• クラスのプロパティにクロージャを割り当て、
その中でselfを参照するような場合
• その場合、キャプチャリストを指定することで
弱参照、アンオウンド参照を指定できる
Swiftのキャプチャリストの書き方
[]の中にキャプチャする変数をカンマ区切りで指定
inを書く
inは省略できない
lazy var someClosure : (Int, String) -> String = {
[unowned self, weak delegate = self.delegate] (index : Int, stringToProcess :
String) -> String in
//closure の処理
return ""
}
var a = 0
let closure =
{ [a] in
print(a)
}
クロージャーの循環参照
class HTMLElement {
let name : String
let text : String?
//プロパティにクロージャーを設定
lazy var asHTML : Void ->String = {
[unowned self] in
if let text = self.text {
return "<(self.name)>(text)</(self.name)>"
}else{
return"<(self.name) />"
}
}
init(name :String, text: String? = nil){
self.name = name
self.text = text
}
deinit{
print("(name)を削除しました")
}
}
クロージャー実行
//HTMLElementを使ってみる
var heading : HTMLElement? = HTMLElement(name: "h1", text: "hello, world!")
print(heading!.asHTML())
() -> String
[unowned self]
self.text , self.name
HTMLElement インスタンス
name: "h1"
text: "hello, world!"
asHTML: () -> String
var heading
強参照
強参照
アンオウンド参照
インスタンスを削除
heading = nil
() -> String
[unowned self]
self.text , self.name
HTMLElement インスタンス
name: "h1"
text: "hello, world!"
asHTML: () -> String
var heading
強参照
アンオウンド参照
インスタンスを削除
heading = nil
() -> String
[unowned self]
self.text , self.name
HTMLElement インスタンス
name: "h1"
text: "hello, world!"
asHTML: () -> String
var heading
強参照
アンオウンド参照
インスタンスを削除
heading = nil
() -> String
[unowned self]
self.text , self.name
HTMLElement インスタンス
name: "h1"
text: "hello, world!"
asHTML: () -> String
var heading
アンオウンド参照
サンプルコード
https://gist.github.com/SatoTakeshiX/
9f80b66cdc009cdd33ce
参考URL
The Swift Programming Language (Swift 2.1)
https://itunes.apple.com/jp/book/swift-programming-language/
id881256329?mt=11
Swift言語を学ぶ/ARC
http://tea-leaves.jp/swift/content/arc
Swiftの循環参照問題におけるunownedとweakの使い分けについて
http://qiita.com/susieyy/items/f57f9362b8e0a89023cb
Swiftのクロージャにおける循環参照問題でunownedとweakの使い分けがわ
からない
http://qiita.com/susieyy/items/39efd4d34cf4c1f9d3ef

More Related Content

Similar to Swiftの循環参照

JAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかた
JAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかたJAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかた
JAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかたYutaro Ono
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...Shotaro Suzuki
 
【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発西 雄樹
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発Kazuki Nakajima
 
Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with HandoffYuichi Yoshida
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
How do you like knockout?
How do you like knockout?How do you like knockout?
How do you like knockout?Narami Kiyokura
 
はじめてのShiny
はじめてのShinyはじめてのShiny
はじめてのShinyKazuya Wada
 
JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE 陽平 山口
 

Similar to Swiftの循環参照 (10)

JAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかた
JAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかたJAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかた
JAWS-UG初心者支部 - 2020-01-29 - マルチアカウント運用のはじめかた
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
 
【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
 
Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with Handoff
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
How do you like knockout?
How do you like knockout?How do you like knockout?
How do you like knockout?
 
はじめてのShiny
はじめてのShinyはじめてのShiny
はじめてのShiny
 
JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE
 

Recently uploaded

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Recently uploaded (8)

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

Swiftの循環参照