7

さまざまなクラスで App Delegate オブジェクトを使用しています。プロジェクト全体でアクセスしたい。Prefix.pch ファイルでこのオブジェクトを次のように定義します。

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

しかし問題は、Appdelegate 変数が App デリゲート変数にアクセスしないことです。エラーが表示されます。

しかし、使用している場合、このコードは正常に機能します

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

私はそれを正しくやっていますか、それとも私がしていることをする方法はありますか?

前もって感謝します。

4

3 に答える 3

15

次のようにする必要があります。

#define Appdelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])
//                  ^----------------------parenthesis--------------------------^
于 2012-05-04T11:57:56.153 に答える
1

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

  1. 物事を間違えるのは簡単です。私たちは皆、演算子の優先順位について優れた本能を持っていますが、プリプロセッサには手がかりがありません。予期しないコンテキストの問題を防ぐために、多くの場合、余分な括弧と中括弧ですべてをラップする必要があります。

  2. コードが別のことをしているときに、あることをしていると自分に言い聞かせるのは簡単です。問題が発生した場合、コンパイラのエラー メッセージもデバッガもあまり役に立ちません。

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

グローバル変数はコードの匂いです。グローバル変数をプリコンパイル済みヘッダーに詰め込むことで、グローバル変数をさらにグローバルにしようとする試みは、コードの匂いがします。フレームワークがどこからでも AppDelegate にアクセスできると判断した場合、これらの (控えめな) フープを飛び越える必要はありません!

したがって、このようなことをしたくなったときは、プリプロセッサが存在し、pch ヘッダーが存在することを知っておくと便利ですが、フレームワークと戦っており、ほぼ確実に設計エラーを犯していることを覚えておいてください。それはあなたの文脈では問題ないかもしれませんが、それは知っておくべきことです.

于 2013-03-22T14:10:07.503 に答える
1

デリゲート マクロを宣言する AppDelegate ファイルをインポートする必要があります。

#import "AppDelegate.h"

そして定義する

#define Appdelegate (((AppDelegate *)[[UIApplication sharedApplication] delegate]))
于 2015-08-30T09:44:57.190 に答える