2012-02-11 46 views
1

A类有一个UIImage。不正确的使用静态变量?

B类有一个静态引用类类型A的B类被实例化

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

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

这可能吗?

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

然而,在我的当前项目,XCode的拒绝让我传递一个整数值:

非静态方法的类A:B类实例化

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

后,我试着在A中调用方法:

UIImage *img = [classA_ imageWithIdentifier:ImageIdentifier_Foo]; 

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

我是不是正确使用静态变量还是存在另一个问题?我意识到我可以使用一个单身人士,但我不希望如果可能的话。

我在这里将枚举声明:*更改为保护无辜

typedef enum 
{ 
    ImageIdentifier_Foo = 0, 
    ImageIdentifier_Bar 
} ImageIdentifier; 

*真实姓名。

+0

为什么_class_'B'在创建'B'的_instance_之前需要引用_instance_的'A'?每个“B”的实例都会有'A'的_same_实例。 – 2012-02-11 20:15:52

+0

'A'包含几个'B'子类使用的不同图像。我想让这些类可以重用,所以每个应用程序可能有不同的图像名称。我想避免让每个子类在每次创建时都发送相同的图像名称,只需使用静态方法发送一次即可。 – TigerCoding 2012-02-11 20:19:58

回答

2

首先...

如果你想之前它被实例化使用类方法上NSObject的一个类静态变量的初始化

+ (void) initialize 

在这里,你可以指定你的静态变量的ClassA在ClassB中。

其次....

确保您能够保留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 
+0

A类拥有自己的init方法,它像任何其他类一样调用[super init]。我不保留,因为我使用ARC。我在代码中犯了一个错误,我改变了'a'的变量名。是的,类型名称的类是被导入的。奇怪的是,在A类中,我现在看到接口方法签名'Expecting a type'中的错误,但是类型的头部被导入并且类型名称是蓝色的,清楚地显示编译器识别类型名称。添加上面的枚举声明。我在做什么应该是正确的?也许XCode很奇怪? – TigerCoding 2012-02-11 20:33:14

+0

谢谢你的帮助。这让我疯狂。 – TigerCoding 2012-02-11 20:45:45

+0

标明你的正确性,因为你清楚地表明它可以完成。 – TigerCoding 2012-02-11 20:57:36

0

的误差得到了清理。

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

循环引用是否会造成这种情况?

+0

不这么认为。我只是用我的示例代码尝试过,仍然没有问题。 – bandejapaisa 2012-02-11 20:47:57

+0

我认为Xcode刚刚搞砸了(不会是第一次)。谢谢你的帮助。 – TigerCoding 2012-02-11 20:57:01