Skip to content

Instantly share code, notes, and snippets.

@takasek
Created June 20, 2017 11:25
Show Gist options
  • Save takasek/5eba86698150b59470adb1d087bac8eb to your computer and use it in GitHub Desktop.
Save takasek/5eba86698150b59470adb1d087bac8eb to your computer and use it in GitHub Desktop.
protocolと参照型の生存期間について確認コード #CodePiece
import Foundation
protocol P {
var name: String { get }
}
class C: P {
var name: String
init(name: String) {
self.name = name
}
}
struct S: P {
let name: String
init(_ p: P) {
name = p.name
}
}
final class Holder: CustomStringConvertible {
let text: String
var `protocol`: P? = nil
weak var `class`: C? = nil
init(_ text: String) {
self.text = text
}
func set(protocol p: P) {
self.protocol = p
}
func set<T: P>(generic: T) {
self.protocol = generic
}
var description: String {
return String(format: "%@\nc: %@ \np: %@\n",
text,
self.class.debugDescription,
self.protocol.debugDescription)
}
}
do {
let holder = Holder("weak参照で持たせる。スコープを抜けたらcは死ぬ")
do {
let c = C(name: "name")
holder.class = c
}
print(holder)
}
do {
let holder = Holder("protocolプロパティに持たせるので弱参照にできない。cは死なない")
do {
let c = C(name: "name")
holder.class = c
holder.protocol = c
}
print(holder)
}
do {
let holder = Holder("Generic funcに通してprotocolプロパティに持たせる。やはりcは死なない")
do {
let c = C(name: "name")
holder.class = c
holder.set(generic: c)
}
print(holder)
}
do {
let holder = Holder("P型の引数に通す。struct化される?と思ったけどそんなことはなかった。これでもcは死なない")
do {
let c = C(name: "name")
holder.class = c
holder.set(protocol: c)
}
print(holder)
}
do {
let holder = Holder("structへと詰め替える。cはスコープ抜けると死ぬ")
do {
let c = C(name: "name")
holder.class = c
holder.protocol = S(c)
}
print(holder)
}
/*
ログ
weak参照で持たせる。スコープを抜けたらcは死ぬ
c: nil
p: nil
protocolプロパティに持たせるので弱参照にできない。cは死なない
c: Optional(__lldb_expr_110.C)
p: Optional(__lldb_expr_110.C)
Generic funcに通してprotocolプロパティに持たせる。やはりcは死なない
c: Optional(__lldb_expr_110.C)
p: Optional(__lldb_expr_110.C)
P型の引数に通す。struct化される?と思ったけどそんなことはなかった。これでもcは死なない
c: Optional(__lldb_expr_110.C)
p: Optional(__lldb_expr_110.C)
structへと詰め替える。cはスコープ抜けると死ぬ
c: nil
p: Optional(__lldb_expr_110.S(name: "name"))
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment