2012-02-11 15 views
1

クラスAにはUIImageがあります。静的変数の使用が正しくありませんか?

クラスBがクラスBがインスタンス化される

前にタイプAのクラスに静的な参照を持つ、私はクラスAのインスタンスを割り当てるために、クラスBの静的メソッドを呼び出したい

+ (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]; 

しかし、暗黙的な変換の警告が表示されます。自動補完は(ImageIdentifier)の代わりに(ID)を表示します。私はすべてのメソッドシグネチャを三重にチェックしており、それらはすべてenum型を使用しています。

私は静的変数を間違って使用していますか、別の問題がありますか?私はシングルトンを使うことができることを知っていますが、私は可能でない方がよいです。

私はここに列挙型の宣言を追加している:*無実を保護するために変更

typedef enum 
{ 
    ImageIdentifier_Foo = 0, 
    ImageIdentifier_Bar 
} ImageIdentifier; 

*実名を。

+0

なぜ、 'class'' B'は 'B'の_instance_が作成される前に 'A'の_instance_への参照を持つ必要がありますか? 'B'のすべてのインスタンスは' A'の_same_インスタンスを持ちます。 –

+0

'A'は、 'B'のいくつかのサブクラスによって使用されるいくつかの異なるイメージを保持します。私はクラスを再利用できるようにしたいので、各アプリは異なる画像名を持つかもしれません。私は、各サブクラスが静的メソッドで一度だけ送信することによって、作成されるたびに同じイメージ名を送ることを避けたいと思います。 – TigerCoding

答えて

2

まず...

あなたはあなたが静的にClassAの変数を割り当てることができる場所ですNSObjectの

+ (void) initialize 

には、クラスのメソッドを使用してインスタンス化される前に、クラスの静的変数を初期化したい場合クラスBで。

第二に....

は、それ以外の場合はリリースされます、あなたはそのクラスAの変数を保持していることを確認してください。第三に

.....あなたの暗黙の型変換について

...変数 'A' は何で、この上にあなたがclassA_を書きました。 enum宣言を表示できますか? 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の。時間

@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では、インターフェイスメソッドのシグネチャに「タイプの予期」というエラーが表示されますが、タイプのヘッダーはインポートされ、タイプ名は青で、コンパイラがタイプ名を認識していることを示しています。上記のenum宣言を追加してください。私がやっていることは正しいはずですか?たぶんXcodeが変わっているのでしょうか? – TigerCoding

+0

ありがとうございました。これは私を夢中にさせていた。 – TigerCoding

+0

あなたのことをはっきりと示しているように、あなたのことを正しいものにしました。 – TigerCoding

0

エラーが晴れました。

クラスBの.hファイルにクラスAをインポートしました。クラスBの.mファイルにもインポートされていました。私は.hファイルのインポートを削除し、それを@class ClassAとすべて自動的に変更しましたそれ自体を解決しました。

循環参照によってこの問題が発生しましたか?

+0

そうは思わない。私はちょうど私のサンプルコードでそれを試みたが、まだ問題はありません。 – bandejapaisa

+0

私はXcodeがちょうどそれからねじ込まれたと思う(初めてではないだろう)。ご協力いただきありがとうございます。 – TigerCoding

関連する問題