0

これは初心者の質問かもしれませんが、ここで少し立ち往生しています。私は通常、さまざまな ViewController でアプリ データにアクセスするために次のようにします。まず、次のように global.h モジュールを宣言します。

グローバル.h

typedef struct {

    NSString *appName
    NSString *appVersion;

    bool mode;

} structApp;

extern structApp app;

その後、MainViewController.h で構造体を宣言して、データにアクセスできるようにします。

@implementation ViewController

structApp app;

- (void)viewDidLoad
{
    app.appVersion = @"v1.02";
}

@end

そして、すべての ViewController.h に「global.h」を含めます。

このようにして、グローバルにアクセスできます。私が見る限り、これは優れた実装であり、20 以上のアプリで使用しています。この構造体のサイズが大きくなると、問題が発生します。そのような場合、破損したメモリ、以前にデータがロードされた nil 変数などが表示されます。

すべてのViewControllerでデータを利用できるようにするより良い方法はありますか? できれば、いくつかの例を教えてください。

4

5 に答える 5

1

2つのオプションがあります

  1. シングルトンクラスを使用する-ObjectiveCシングルトンを参照
  2. アプリデリゲートでプロパティを宣言する-SOを参照

次を使用して、任意のクラスからアプリデリゲートにアクセスできます。

AppDelegate *appDel = [[UIApplication sharedApplication] delegate];
于 2013-03-13T08:27:02.303 に答える
1

構造で使用externしていたように、同じ値を更新するオブジェクト。

OOPS では、グローバル変数は決して良いとは言えないため、シングルトン パターンを使用する必要があります。

構造にこれらすべてのものを持つシングルトン/共有クラスを作成して使用します。

于 2013-03-13T08:24:32.563 に答える
0

プリミティブデータを処理する場合にのみ、構造体を処理する必要があります(OOP方式の場合)。

  app.appVersion = @"v1.02";

関数スコープ内のデータをポイントしているため、構造体がダングリングポインターをポイントするようにします(app.appVersionはポインターのみを保持し、データは保持しません)。したがって、コンテンツを安全にするために、これらのオブジェクト値をすべて保持する必要がありますが、それでもQ&Dアプローチであることを認める必要があります。

データへのグローバルアクセスが必要な場合は、データへの強力なカプセル化と制御が本当に必要な場合にのみ、シングルトンを使用できます。

シングルトンの作り方 Objective-Cシングルトンはどのように見えるべきですか?

マクロも使用できます。定数文字列は、処理しているスコープで常に使用できるため、データの永続性を気にすることなく使用できます。

于 2013-03-13T08:27:27.363 に答える
0

一般に、構造体を使用すると問題なく動作するはずです。それらを使用しても問題はありません。メモリのオーバーラップや違法な再利用などによって奇妙な値が発生した場合、問題は別の場所にありますが、原則として構造体を使用することではありません。このextern発言は、このような問題を引き起こす可能性があります。

メモリ使用量の観点からは、クラスも構造体以上のものではありません。私があなただったら、構造体を使用するときにメンバーがいる場所にプロパティを持つクラスを設計します。そして、それらをほぼ同じ方法で使用します。

「グローバル変数」については、シングルトン パターンを適用します。これは基本的に、クラスの唯一のインスタンスを使用可能にするクラス メソッド (先頭の - ではなく +) を持つクラスです。そのメソッド内で、クラス (同じクラスへのクラス内部静的参照) が既に使用可能 (!= nil) であるかどうかを確認し、それをインスタンス化します。そのために初期化メソッドを使用することがあります。初期化はobjective-cの典型的なものです。クラスが初めて使用されるとき、またはその前に、サブクラス化されたものであっても、各クラスに対して一度だけ呼び出されます。クラス変数をシングルトンとしてインスタンス化するのに非常に適していますが、他のプログラミング言語には移植できません。

于 2013-03-13T08:36:27.060 に答える