【Xcode6.3.1,iOS8】[NSPlaceholderString initWithString:]: nil argument というエラーについて

ちょっと画像が見づらいかもしれませんが、
[NSPlaceholderString initWithString:]: nil argument が出てきた時について。


エラーの表示から推測できるように、nil argumentとあるから、
何かがnilなんだなぁと思うわけです。

あれー、おかしいな、空っぽのはずないんだけどなあとまず思う。


大体は凡ミスであることが多い。

一例を挙げる。

あるクラス、ViewControllerであろうがNSObjectであろうがなんでも良い。

NSUserDefaultsを様々なクラスで使っていて、インスタンス変数としてコピペして宣言した場合。

@interface ViewController () 
{
    NSUserDefaults *userDefaults;
}

よしよし、ちゃんとインスタンス変数の宣言をしたぞと。

そして、ここである宣言をすっぽかしていきなりアクセスしようとしてしまうわけです。
たとえばこのアプリのどこかの場所でプロフィールを登録していて、nameというキーで文字列を保存していた場合、

NSString *str = [NSString stringWithFormat:@"名前:%@"[userDefaults stringForKey:@"name"]];

これでさっき登録してもらった名前が取り出せるはずだ、
さてテストしよう!

....


....


[NSPlaceholderString initWithString:]: nil argument


あれれれれれ?????????


このケースでは、非常に初歩的ですが、
NSUserDefaultsを使うときの準備を忘れています。

たとえばviewDidLoadなどに、

- (void)viewDidLoad {
    [super viewDidLoad];
    userDefaults = [NSUserDefaults standardUserDefaults];
}

があって初めて保存機構にアクセスできます。

すなわち、今回ではこの記述がなかったためにいきなりNSUserDefaultsにアクセスしても空っぽであった、ということです。



通常つまるようなところではないのにnil argumentと怒られた時には、
それは空っぽになってるよってことですから、なぜその変数が空っぽになっているのかをNSLog等を使いながら謙虚に検討することが大切ですね。