0

タイトル行に記載されているエラーについて、すでに質問しているユーザーはほとんどいないことを理解しています。しかし、私はObjective-Cプログラミングの初心者であり、他のページの応答がこのプログラムでエラーが発生する理由にどのように答えるかを結び付けることができません。

ありがとう!

@interface ClassA:NSObject

{
    int x;
}

-(void)initVar:(int) a;

@end

@implementation ClassA

-(void)initVar:(int) a
{
    x=a;
}

@end

@interface ClassB:ClassA

-(void)printVar;

@end

@implementation ClassB


-(void)printVar
{
    NSLog(@"X = %i", x);
}

ClassA *a= [[ClassA alloc] init]; // shows error: Initializer element is not a compile-
                                  // time constant.
[a initVar:100]; 

@end
4

1 に答える 1

0

Objective-CはCの厳密なスーパーセットです。Cでは、関数(またはObjective-Cのメソッド)の外部に実行可能コードを含めることは違法です。

タイプのグローバル変数ClassAを使用する場合、最良の解決策(IMHO)は、クラスメソッドを使用してそれにアクセスすることです。これにより、初期化も可能になります。

static ClassA *a = nil; // static limits the visibility of a

+ (ClassA*) theA
{
    static dispatch_once_t pred;

    dispatch_once(&pred, 
    ^{
         a = [[ClassA alloc] init];
         [a initVar:100]; 
    });
}

このdispatch_once()呼び出しは、初期化コードが1回だけ実行され、すべてスレッドセーフな方法で実行されるようにするために現在好まれているイディオムです。

メソッドには別の名前を選択する必要がありますinitVar:initプレフィックスは、オブジェクトの初期化メソッド(のような)を示す規則ですinit

于 2012-08-13T13:13:07.197 に答える