Objective-Cのnil/Nil/NULL/NSNullの使い分け

Objective-Cには「null」に相当するものがnil, Nil, NULL, NSNullの4種類ある。それぞれの意味の説明はあったが、使い分けに踏み込んだ記事が少なかったのでメモ。

nil

// 初期化に失敗した時はnilが入る
SomeClass *myInstance = [[SomeClass alloc] initWithFailCode];

// 変数に代入
id hoge = nil;
NSObject *fuga = nil;

if (fuga) {
  // false
}
if (!fuga) {
  // true
}
if (fuga == nil) {
  // true
}

// nilにメッセージを送信してもnilが返る
if ([fuga doSomething] == nil) {
  // true
}

// ブロックを渡す時のnullオブジェクトはnilで渡す
[something setCompletionBlock:nil];

Nil

  • Nil はnullクラスオブジェクトを表す
// クラスを取得する
Class something = [NSObject class];

// クラスの指定がnull
Class anything = Nil;

NULL

  • C言語の (void *)0 と同じ
  • void* 型のnullとして使う
[objA addObserver:objB forKeyPath:@"hoge" options:NSKeyValueObservingOptionNew context:NULL];

NSNull

  • nullであることを示す、シングルトンのインスタンス
  • シングルトンの取得には [NSNull null] を実行する
  • インスタンスなので、[NSNull null] == nilNO (false) になる
  • NSArrayやNSDictionaryの値のように、nilを指定できないところでnullオブジェクトを表したい時に使う
NSDictionary *someVars =
@{
  @"keyA" : @"abc",
  @"keyB" : [NSNull null]
 }

// 1. NSNullはシングルトンなのでisEqualで比較できる
if ([someVars[@"keyB"] isEqual:[NSNull null]]) {
  // true
}

// 2.NSDictionary#objectForKeyは存在しないキーを指定するとnilを返す
if (someVars[@"keyC"] == nil) {
  // true
}

// 1.と2.により、キーに値が存在するかどうかは2つの検査が必要
if (someVars[@"keyA"] != nil && ![someVars[@"keyA"] isEqual:[NSNull null]]) {
  // nilではなく、NSNullでもない
  // => true
}

参考資料

iOSでTwitter投稿で「ツイートを送信できません」とエラーが出る

iOSにTwitter投稿する機能をSLComposeViewControllerを使ってつくったところ、「ツイートを送信できません」というエラーが出るという報告がきた。全文を書くと以下のような感じ。

ツイートを送信できません

Twitterに接続できなかったため、ツイート"◯◯◯◯◯◯"は送信できません。

これは、iOSで設定されているTwitterアカウントが、パスワードが間違っていたり変更忘れがあったりで、本当にTwitterに接続できなくなってるだけ。設定 -> Twitter -> @(アカウント名)から再ログインしなおしてもらうと解決する

pod lib lintで他のdependencyなライブラリのせいでnot pass validationになる時

pod lib lint hoge.podspecを実行した時に以下のようにエラーが起きてしまい、lintが通らないことがある。

続きを読む pod lib lintで他のdependencyなライブラリのせいでnot pass validationになる時

samurai-native: Objective-CなのにHTML+CSSっぽくViewを構築できる黒魔術ライブラリ

まだ使っていないので黒魔術と断定するのも失礼な話かもしれないけれど、ちゃんと動くならかなり便利そうなライブラリを見つけた。

https://github.com/hackers-painters/samurai-native

Storyboardを使わずにコードだけでiOSアプリを書く時の最小限のコード

自分用のメモ

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  window.rootViewController = [[UIViewController alloc] init];
  [window makeKeyAndVisible];
  self.window = window;
  return YES;
}

Xcode6の新規プロジェクトでクラス名にプレフィックスを付ける

標題の件、以下の通り。

  • 左側のProject Navigatorでプロジェクトを選択
  • 右側のFile InspectorのProject Documentの中にあるClass Prefixに付けたいプリフィクスを書く
  • ハッピー