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 中的方法)之外拥有任何可执行代码是非法的。

如果您的意图是拥有一个全局变量 type ClassA,最好的解决方案(恕我直言)是使用类方法来访问它。这也将允许您进行初始化。

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

于 2012-08-13T13:13:07.197 回答