読者です 読者をやめる 読者になる 読者になる

ごらくらいふ

プログラミングしたりゲームしたり

NSFileManager fileExistsAtPath でコケてた話

ディレクトリの存在チェックを書いてコケた

アプリ内の領域に保存するため、ディレクトリを切ろうと以下のコードを書いたらコケた。

ちなみに、最初の1回は通って、2回目から(ディレクトリが作られてから)常にコケるようになった。

gistdf32f6e75d82d6541429

正しく書いた

よく見たり、サンプルあさったら致命的ミスが分かったので直した。

gist79ba97d73d940161fac6

BOOL型のポインタを渡さねばならないところ、YESを置いてしまっていた。 (true--(アドレス評価)->0x1)

ファイルパスが存在した場合、isDirectory にセットされた変数にディレクトリかどうか書き込むらしい。 そこにYESなんてものが置いてあったせいで、アプリの領域外へ書き込もうとしてしまった模様。

1回目が通った理由は、パスが存在しなかった時点で処理が終了したからと思われる。 (それゆえか、BOOLポインタをただ置いたら、XcodeにNULL初期化を差し込まれた) ←これはCの常識と学習しました…初期化大事…(追記:2016/01/26)

まとめ

  • [[NSFileManager defaultManager] fileExistsAtPath: isDirectory:isDirectory: に渡すのはBOOLポインタ!!
  • Xcodeのヒントよく見よう!!!
  • 0x1へのアクセスとかC系列言語こわ!!!!