循環参照とは
経緯
僕はswiftのクロージャーを安易に使って循環参照を行ってしまいました。 その時にこの言葉を知らなかったため検索できずハマってしまったので記録しておきます。
循環参照とは
メソッドAはメソッドBを呼び出します。 メソッドBはメソッドAを呼び出します。 そしてこれが無限に続くことになります。 この参照が回ってしまうことを循環参照というわけですね。
循環参照が起きてしまうパターン
何が問題なのか?
- エラーを吐かないことでしょう
- 無限に回ってしまうので無限にメモリを消費してしまう
- システムが止まらない
解決策
雑談
単語は結構検索するけどイマイチ定着しないことがおおいいです。 今回のように循環参照という言葉は言われればなんとなく意味がわかるけど 普段使ってない言葉なのですぐに言葉が思い出せない。 なので今度から単語もブログに書いていこうと思う。
初めてphp やったことまとめてみた
昔はこういう資料は全部gitで管理してたけど見にくいしアクセスしづらいからこっちの方がいいと思いました。
というかGoogleのこのドキュメントやエクセル の機能すごく使いやすくてもうオフィスいらないまであると感じてます。
OAuth わかりやすい資料見つけた
超わかりやすくて特に自分が補足できるようなものはないです。
ちなみにOAuthのできた背景は
Webサービスの連携が増えたため情報共有が問題となってた→
OpenIDのような連合アイデンティティが解決策として登場した→
しかしこれはIDの持ち主による 認証でリソースアクセス認可を扱えない→
webAからwebBに連携する方がいいよね→
OAuth誕生
てな感じです。
まだまだ残業地獄の時にブログに残したい資料を貯めたのが残っているので毎日少しづつでいいので書いていきたいです
swiftのクロージャ
クロージャとは
自分を囲むスコープにある変数を参照する関数 Swiftは第一級関数をもつ。関数そのものを型に指定できたり、関数をインスタンス化します。 関数に名前がない無名関数としても定義することも可能です。
使い方
//雛形 {(引数名1: 型, 引数名2: 型...) -> 戻り値の型 in クロージャの実行時に実行される文 必要に応じてreturn文で戻り値を返却する } //サンプルコード1(処理内容1文) let double = { (x: Int) -> Int in x * 2 } double(2) //実行結果 4 //サンプルコード2(処理内容2文以上) var plus = { (x: Int) -> Int in var y = 0 y += x return x + y } plus(3) //実行結果 6 3
使い所としては変数や引数に関数の中身を直接代入できるので、グローバル変数の削減やや関数の実行結果を次の処理で続けて使用する関数を作成したい場合に使用できます。名前が不要であったり、型推論してくれるので関数定義よりも軽く定義できます。
自分はあまり使わないけど... defer
defer とは
スコープを抜け出すときに実行するもの
例
func deferTest() { let arrayData = ["red", "blue", "yellow", "pink"] for data in arrayData { defer { print("defer文実行") } if data == "blue" { print("スコープを抜けます") break } print(data) } } deferTest() // 【結果】 // red // defer文実行 // スコープを抜けます // defer文実行
注意
defer前にreturnやbreakしてしまうと実行されない
func deferTest(param: String) { if param == "blue" { print("スコープを抜けます") return } // このdeferは実行されない defer { print("defer文実行") } } deferTest(param: "blue") // 【結果】 // スコープを抜けます
社内でよく使う人がいたので必然的に覚えました。 しかし可読性には問題なくてもコード読んでる最中に忘れてしまうことがあったのであまり好きにはなれませんでした。