- ベストアンサー
ARCを使った場合のBOOL値の存在判定について
- ARCを使用している場合に、BOOL値の存在判定をする方法について質問です。
- 現在、自作のiPhoneゲームの開発を行っている中で、ユーザーのプロフィール公開の情報を保存したいと考えています。
- BOOL型で値を保存する際の存在判定方法について教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
言語仕様をちゃんと理解せず勘でコーディングしているように見えます。 一度、Objective-C言語の解説本を読んで言語仕様の基本を 抑えることをお勧めします。 とりあえず、今回の回答のために以下のURLの説明を読んでください。 http://www.atmarkit.co.jp/ait/articles/0812/15/news138.html ここに書いてある通り、BOOL型が表す値はYES(1)かNO(0)だけです。 常にYESかNOかのどちらかの値が入っており、値が入っていない という概念はありません。 (変数宣言だけして、初期化してない場合は、以前に使用されていたメモリ値が 残ったままの不定値になります。インスタンス変数の場合は自動的にNO(0)で 初期化されます。) クラスオブジェクトを示す変数なら、値が入っていなければnilだし、 入っていればオブジェクトへのポインタが設定されています。 「if(BOOL変数 != (id)[NSNull null])」 は、BOOL型とクラスオブジェクトのポインタを比較することはできないので 当然エラーになりますし、 「if(!(BOOL変数 == 0 || BOOL変数 == 1))」 は、BOOL変数が初期化されていなければ、以前に使用されていたゴミ値が 使用され、条件が成立するか否かはわかりません。 もし、BOOL値を扱いながら、値が入っていない状態も表したいのなら、 NSNumberクラスを使って、 // YESを代入 NSNumber *boolObject = @YES; // NOを代入 NSNumber *boolObject = @NO; // 値が入っているか確認 if (boolObject != nil) // boolObjectにYESが入っているか確認 if ([boolObject isEqualToNumber:@YES]) と書けば実現できます。 ただ、今回のケースで値が入っていない状態を本当に表現する 必要があるのかは疑問です。 ユーザーが自分のプロフィールを公開するかどうかは、 ユーザーがまだ何も選択していない初期状態ではNOにしておけばよく、 ユーザーが公開を許可した時にYESにすればいいだけだと思います。
その他の回答 (1)
あなた、ARCというものを理解してませんよ。 ARCは、Xcode4.2以降で取り入れられた、オブジェクトのメモリ管理手法で、オブジェクト型の実体管理に使われます。 BOOLは、実際には、オブジェクト型ではないので、ARCによるメモリ管理の対象外です。 こういうことは、ソース上に、 BOOLとかいて、マウスカーソルを持って行って、カーソルをBOOLのところにおけば、右側のペーンのQuick help inspectorのところに、なんだ、という情報が出ますがね。それで、 BOOL のDeclarationは、typedef signed char BOOL だということがわかる。
お礼
xpd154さん ご回答ありがとうございます。 >ARCは、Xcode4.2以降で取り入れられた、オブジェクトのメモリ管理手法で、オブジェクト型の実体管理に >使われます。 >BOOLは、実際には、オブジェクト型ではないので、ARCによるメモリ管理の対象外です。 この点、大変参考になりました。 ARCが漠然とメモリを管理するものだという理解しかありませんでした。 ありがとうございます。
補足
回答ありがとうございます。 ARCを使ったうえで、と記載したのが誤解を生んでしまったとしたらすいません。 エラーの原因がARC Restrictionとあったので、自分が知らないARCの処理が原因かなと 思ったので、記載しました。 せっかくいただいたアドバイスを理解できていないのですが BOOL変数に値が保存されているか(=nullでないか)を判定するには C言語の様式でchar型がnullかどうかを判定すればいいということでしょうか。
お礼
Lchan0211bさん 回答ありがとうございます。 大変、参考になりました。 >言語仕様をちゃんと理解せず勘でコーディングしているように見えます。 >一度、Objective-C言語の解説本を読んで言語仕様の基本を >抑えることをお勧めします。 はい、おっしゃる通り、初心者の時にやっている内容にまったく実感がわかず、 まずiPhoneアプリを作って必要なところを学んでいこうと考えて、ここまでやってきました。 ご指摘を受けて、はっとしました。 急いで、ゲームを完成させたくても 基本を再度、見直す時期だと再確認致しました。 また、問題解決の具体的なアイディアまで頂きましたので、BAとさせて頂きます。 ありがとうございます。