4

コードをテスト可能にするために、レイジーイニシャライザーを作成しました。このように、単体テストでは、ゲッターが呼び出される前に、必要なオブジェクトをモックできます。

ただし、クラスメソッドに関しては、クラスメソッドは定義したプロパティにアクセスできません。

  1. クラスメソッドでプロパティにアクセスできるようにする方法はありますか?
  2. そうでない場合は、このクラスの外部でもアクセスできる静的変数を作成する方法はありますか?つまり、単体テストクラスからアクセスできますか?

@implementation
@synthesize webService;

+ (void)doSomething
{
   self.webService.url = @"some url";
   [self.webService start];
   // do other things
}

- (WebService*)webService
{
   if (!webService)
   {
      webService = [[WebService alloc] init];
   }
   return webService;
}

@end
4

3 に答える 3

6

定義上、クラスメソッドは状態を持つことができないため、「インスタンス」の一部であると想定される変数にアクセスできません。インスタンスメソッド(「-」で始まるメソッド)では、セルフポインターはメソッドが呼び出されているインスタンスを参照しますが、クラスメソッド(「+」で始まるメソッド)では、「self」は参照します。特定のインスタンスではなく、クラス自体。これは、プロパティに直接アクセスする方法がないことを意味します。

ただし、これを行う1つの方法は、実装ファイル内にクラスの静的インスタンスを作成することです。

static WebService* webService;

次に、「sharedInstance」メソッドのようなものを使用してアクセスし、変数を確実に割り当てることができるようにします。

+(WebService*)sharedInstance
{
    if( nil == webService )
    {
        webService = [[WebService alloc] init];
    }
    return webService;
}

もう1つのオプションは、実装ファイルで静的変数を定義してから、他のファイル/クラスから静的変数を設定および取得するためのクラスメソッドを作成することです。

于 2011-04-24T16:33:46.363 に答える
3

シングルトンが必要なようです。

<...>

Upd:この方法が受け入れられない場合は、次の質問に対する直接の回答があります。

クラスメソッドでプロパティにアクセスできるようにする方法はありますか?

いいえ。何らかの方法でインスタンスを作成する必要があります。

そうでない場合は、このクラスの外部からもアクセスできる統計変数を作成する方法はありますか?(私のユニットテストクラスからアクセス可能

はい。インスタンスを保持する静的変数またはグローバル変数を作成できます。クラス外からアクセスできます。静的変数は、それが定義されているソースファイル内でアクセスできます。そしてグローバル変数はどこからでもアクセスできます。グローバル変数を処理したい場合は、*。mファイルで定義します。

MyClass *my_inst;

そして、*。hファイルで宣言を行います。

external MyClass *my_inst;
于 2011-04-24T16:31:33.460 に答える
2

.mまたは、のように静的変数を宣言することもできます

static NSString *name = @"Bob";

のようなメソッドを宣言します

- (NSString *)getName {
  return name;
}

外部から内部名を取得します。この方法では、外部グローバル変数を扱う必要はありません...

于 2016-11-25T22:55:05.197 に答える