2012-05-04 7 views
7

異なるクラスのApp Delegateオブジェクトを使用しています。私はプロジェクト全体にアクセスしたい。アムは#defineを使用してApp Delegateオブジェクトにアクセスできない

#define Appdelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] 

としてPrefix.pchファイルにこのオブジェクトを定義するが、問題はAppdelegate変数は、アプリケーションデリゲート変数にアクセスしないということです。 エラーが表示されます。

が、午前の使用は、このコードは正常に動作している場合

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.variablename; 

私は正しいことをやったり、私が何をやっての方法があるだろうか?

アドバンスで感謝します。

答えて

15

は次のようになります。

#define Appdelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate]) 
//     ^----------------------parenthesis--------------------------^ 
+5

いいえ。あなたの '#define'では、' [Appdelegate variablename] 'は動作しますが、' Appdelegate.variablename'は動作しません。外側の括弧を省略すると、 '(AppDelegate *)'へのキャストは式全体で行われるので、この場合は 'variablename'です。 – Cyrille

+1

Sharetに感謝しています。 – Bond

1

この質問とその答えが示すように、プリプロセッサに寄りかかっするには、通常は悪い考えです。

  1. 間違っているのは簡単です。私たちはすべて演算子の優先順位の良い本能を開発しますが、プリプロセッサには手がかりがありません。予期せぬコンテキストの問題を防御するために、すべてを余分な括弧と中括弧で囲む必要があることがよくあります。

  2. コードが別のことをしているときにあなたが1つのことをやっていることを自信を持って考えるのは簡単です。事態が壊れると、コンパイラのエラーメッセージやデバッガのどちらも大きな助けにならないでしょう。

  3. 最も重要なことに、プリプロセッサは悪い考えをして、プログラム全体に広めることができます。ここでの悪い考えは、App Delegateをグローバルに使用することです。

グローバル変数はコードの匂いです。グローバル変数をあらかじめコンパイルされたヘッダーに埋め込むことで、グローバル変数をよりグローバルにする努力は、コードの匂いです。フレームワークがどこからでもAppDelegateにアクセスする必要があると考えたら、これらの(控えめな)フープを飛び越える必要はありません!

このようなことをしたいときは、プリプロセッサがあり、そこにpchヘッダーがあることを知ってうれしいですが、フレームワークと戦っており、設計上の誤りをほとんど確実に起こしていることに注意してください。それはあなたの文脈では問題ないかもしれませんが、知るべきことです。

2

あなたは、デリゲートのマクロを宣言しているAppDelegateファイルをインポートする必要があります。

輸入 "AppDelegate.h" そして

Appdelegate(((AppDelegate *)[[のUIApplication sharedApplicationを定義を定義します]デリゲート]))

関連する問題