不正确使用静态变量?

时间:2012-02-11 19:47:36

标签: iphone objective-c ios static

A类有UIImage。

B类具有对A类的静态引用。

在实例化类B之前,我想在类B中调用静态方法来分配类A的实例。

+ (void)setClassAReference:(ClassA*)classA
{
    classA_ = classA;
}

这可能吗?

在深入研究当前项目之前,我创建了一个样本,并且能够设置一个整数值,然后用它来实例化B,保留存储的值并允许访问它。

但是,在我当前的项目中,XCode拒绝允许我传递一个整数值:

A类非静态方法:

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type

在实例化B类之后,我尝试在A:

中调用一个方法
UIImage *img = [classA_ imageWithIdentifier:ImageIdentifier_Foo];

但是我得到一个隐含的转换警告。自动完成显示(id)而不是(ImageIdentifier)。我已经对所有方法签名进行了三重检查,并且都使用了枚举类型。

我是否正确使用静态变量或是否存在其他问题?我意识到我可以使用单身人士,但如果可能,我宁愿不这样做。

我在这里添加了枚举声明:*

typedef enum
{
  ImageIdentifier_Foo = 0,
  ImageIdentifier_Bar
} ImageIdentifier;

*真实姓名改变以保护无辜者。

2 个答案:

答案 0 :(得分:2)

...首先

如果要在实例化之前初始化类上的静态变量,请在NSObject上使用类方法

+ (void) initialize

这是您可以在ClassB中分配静态ClassA变量的地方。

其次....

确保保留该classA变量,否则将被释放。

第三.....

关于你的隐式转换......什么是变量'a',在这之上你写了classA_。你能展示你的枚举声明吗?你导入了ClassA吗?

我没有任何编译错误:

ClassA.h

typedef enum
{
    ImageIdentifier_Foo = 0,
    ImageIdentifier_Bar
} ImageIdentifier;

@interface ClassA : NSObject

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type

@end

ClassA.m

#import "ClassA.h"

@implementation ClassA

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier {
    return nil;
}

@end

ClassB.h

@interface ClassB : NSObject

@end

ClassB.m

#import "ClassB.h"
#import "ClassA.h"

static ClassA *classA;

@implementation ClassB

+ (void) initialize {
    classA = [[ClassA alloc] init];
}

- (void) doSomething {
    UIImage *image = [classA imageWithIdentifier:ImageIdentifier_Foo];
    NSLog(@"image %@", image);
}

@end

答案 1 :(得分:0)

错误已清除。

我在类B的.h文件中导入了A类。它也被导入到B类的.m文件中。我删除了.h文件中的导入,并将其更改为@class ClassA一切都自动解决了。

循环引用会导致这种情况吗?