2012-02-11 77 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