Skip to content

Instantly share code, notes, and snippets.

@ukitaka
Last active September 3, 2016 15:50
Show Gist options
  • Save ukitaka/0bba8269ceb0754654a4dee858986ff4 to your computer and use it in GitHub Desktop.
Save ukitaka/0bba8269ceb0754654a4dee858986ff4 to your computer and use it in GitHub Desktop.
クロージャー受け取るところにメソッド渡すと、メソッドが生えてるオブジェクト強参照する..
textField.rx_text
.map(myMethod) // selfが強参照される → リークする
.subscribeNext { _ in }
.addDisposableTo(disposeBag)
textField.rx_text
.map { [unowned self] in self.myMethod($0) } // 長いけどこう書くしかない
.subscribeNext { _ in }
.addDisposableTo(disposeBag)
textField.rx_text
.map(myFunction) // メソッドにする必要がなければ関数にするのも手
.subscribeNext { _ in }
.addDisposableTo(disposeBag)
@ukitaka
Copy link
Author

ukitaka commented Aug 22, 2016

ローカル関数とかでもダメ

@ukitaka
Copy link
Author

ukitaka commented Sep 3, 2016

例えば let で定義すれば self は参照できないがクラス内に定義でき、map(myMethodVariable) のように書いても self は強参照されない

let myMethodVariable: String -> Void = { text in
    print(text)
}

@ukitaka
Copy link
Author

ukitaka commented Sep 3, 2016

Weakify を使えば{ [unowned self] ... } をしなくてもできるが、そもそも長い。。

textField.rx_text
    .map(weakify(self, self.dynamicType.myMethod))
    .subscribeNext { _ in }
    .addDisposableTo(disposeBag)

でも現時点ではこれを使うのが一番クールかもしれない。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment