見出し画像

【Console Application】ファイルとデータベース 300【学習記】

今回の概略

以前の修正で先手を打って EXC_BAD_ACCESS を取り除いたと思いきや、取り除けて無くて再び対応に迫られるの巻😞

#学習記 #Objective_C
#setter #無限ループ #EXC_BAD_ACCESS

【Console Application】ファイルとデータベース【学習記】
仕様
https://note.com/sayka/n/nb8a67fa90a64?magazine_key=m7bb64c6a359f#br1mB

仕様
レコード
・レベル
 1-12
・難易度
 b,n,h,a,l
・曲名
・ランプ
 -,x,a,e,c,h,e,f

オプションスイッチ
-u file.csv # 更新(略値)
 ファイル名だけ指定した場合更新処理と見做す
-d file.csv # 削除
-p # csv 出力(略値)
 何も指定せずに起動した場合出力処理と見做す
-v # バージョン
-h # ヘルプ

----備忘録
(現在無し)


前回の粗筋

OC の辞書も新しい書き方は他と変わらない key:value になっていたとか🙄



デバグ

それじゃ -p の動作試験するぽ😑
CSV と DB を同時に検査する事になるので困難が予想されるお🙄
今までの経験から言って、絶対一発で通らない😞
ただ、これが通れば -u も -d も「多少の修正」になる筈なんだけどはてさて…👇ぽちっとな

ほーら早速😞
例外見て .csv じゃんってなったけど止まってる場所の判定式55行見ると .csv なら真になるのでまぁ所謂1つの「反転not忘れ」ね🙄
ここの処理、 Java 系と大きく違うので似た処理で書き直してるんだけどその時に条件式を間違えやすく、ここはその間違いの1つかな😞
結構そういう場所が有るので似た様な間違いで何度も直す事になると思うけど問題はここみたいに止まってくれない場合かな😑

直して走らせたけど応答が無い…またsetter 無限反復かしら?😑

はい来ましたー🤢
無限反復で正解ー😞
まぁ、これの対処法は判っているのが救いか…🙄

自分用備忘録みたいな役割をこの note に期待してるところもあるのでここにも一応書いておこうかな、これが何だか🤤


初期化処理で長く待たされて EXC_BAD_ACCESS が出る現象

簡単に言うと setter 内の代入で setter代入関数自身 が呼ばれて無限ループしてスタックが足りなくなってメモリアクセスできなくなって件のエラーが出るのがこの障害ERROR😑
解決方法は self.var ではなく _var の様な synthesize による別名割当てを使ってプロパティの直操作を行う事🤔

これはどうやら OC の挙動の問題みたいで Obj.prop の様な形式で書かれると Obj の setter,getter が呼ばれる仕掛けで self.var という書き方は self は自オブジェクトを指すものの書式的には Obj.var に相当するので setter,getter が呼ばれるワケで、そんな setter で `self.var = arg` なんて書いたりしたら `[Obj setVar:arg]` に変換されて setter が呼ばれた挙げ句再び `self.var = arg` で………😫アッー!
これを防ぐ為に自クラスのプロパティをローカル変数っぽく使って setter,getter を介さないという使用法が用意されていてそれを可能にするのが synthesize による別名設定🤔
通常 @property 宣言された場合 setter,getter,synthesize は自動で設定され、別名は標準でアンダースコアを頭に付けた物となるんだけど、独自の setter,getter を書くと synthesize も自分で書かないといけないらしくて setter,getter を書いて synthesize を入れないままだと今回の様な `self.var = arg` を setter に書くしかなくなって障害発生待ったなし😞
独自の setter,getter を書いたら synthetize も書いて setter は `_var = arg` に😑


デバグ 2

件の場所を見ると確かに self.value になってるわけなんだけど、68,69行を見ると対応した形跡が有るのよね🙄
前回直したと思ってたら setter を直すの忘れてたってオチだった😞

こうなると勿論似た事をしている Record も忘れてる可能性が高いわけで…🙄
………
プロパティが RecordElement の配列しか無いから関係なかった🤪

一見何事もなく終了した様に見えるけれど正しくない😑
ただ、目的の場所にファイルができていて改行が3つ書き出されているので DB の読込み件数は合ってるっぽいかな🤔
(複製時の DB は2件で columnNames が1行目に入るので3行書き出されるので数だけは合致している)


次回は

状況からすると csv 書出し文字列の生成でヘマってるのかな?🤔
そこから確認するぽ🤤

この記事が気に入ったらサポートをしてみませんか?