Initializer元素不是编译时常量

时间:2012-08-13 03:39:15

标签: objective-c

据我所知,很少有用户已经询问过标题行中列出的错误。但是,我是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

1 个答案:

答案 0 :(得分: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()调用是目前最受欢迎的习惯用语,用于确保初始化代码仅执行一次,并且全部以线程安全方式完成。

您应为initVar:方法选择其他名称。 init前缀是一种表示对象初始化方法的约定(如init)。