0

いくつかの情報: "House"と "Treasury"の2つのクラスがあります。 これらは両方とも "構造体"と同じNSMutableArrayの内側にあります。 ハウスには "所有権"という(int)変数があります。 私はforループ(100ループ)を使用して、エリア全体に住宅や宝庫を作成しています。 それから私は "構造"をループし、それに "所有権"の整数を割り当てる別のループを持っています。 そのループでは(Houses * h in structures)を使用しますが、なんらかの理由でループは構造内の "treasury"もループします。 財務省はオーナーシップ変数を持っていないので、私は "setOwnership:"が存在しないというエラーを受け取ります。 私もCocos2Dを使用していますが、それは問題ではありません。Obj-Cのエラー "インスタンスに送信された認識できないセレクタ"

// Variable 
NSMutableArray *structures; 


-(void) InitializeStructures 
{ 
    structures = [[NSMutableArray alloc]init]; 

    for(int i = 0; i < initialColonies; i++) 
    { 
     House *h = [[House alloc]initWithFile:@"House.png"]; 
     h.position = [self ReturnPositionOnMap]; // Returns a point in playing area 

     Treasury *t = [[Treasury alloc]initWithFile:@"Treasury.png"]; 
     t.position = [self ReturnFarPointNearOrigin:h.position]; 

     [structures addObject:h]; 
     [self addChild:h z:1]; 

     [structures addObject:t]; 
     [self addChild:t z:1]; 
    } 
} 

-(void) AssignOwnerships 
{ 
    for(House *h in structures) 
    { 
     // Simplified to only show where the error occurs. 
     h.ownership = [self ReturnID]; // Error occurs here. 
     // The error ONLY occurs when it is iterating through a Treasury. 
    } 
} 

構造::

#import "CCSprite.h" 
#import "ImportedGoods.h" 

@interface Structure : CCSprite 
{ 
    int _integrity; 
    int _ID; 
    bool _occupied; 
    int _occupiedTimeLeft; 
    int _occupiedTimeMax; 
    Faction _faction; 
} 
@property(nonatomic, assign) int integrity; 
@property(nonatomic, assign) int ID; 
@property(nonatomic, assign) bool occupied; 
@property(nonatomic, assign) int occupiedTimeLeft; 
@property(nonatomic, assign) int occupiedTimeMax; 
@property(nonatomic, assign) Faction faction; 
@end 

#import "Structure.h" 

@implementation Structure 

@synthesize integrity = _integrity; 
@synthesize ID = _ID; 
@synthesize occupied = _occupied; 
@synthesize occupiedTimeLeft = _occupiedTimeLeft; 
@synthesize occupiedTimeMax = _occupiedTimeMax; 
@synthesize faction = _faction; 

@end 

ハウス:

#import "Structure.h" 
#import "ImportedGoods.h" 

@interface House : Structure 
{ 
    int _ownership; 
} 
@property(nonatomic, assign) int ownership; 
@end 

#import "House.h" 

@implementation House 

@synthesize ownership = _ownership; 

@end 

財務省:

ここ

は、コードは次のようになります

これはエラーです:

2011-11-07 18:45:29.016 Virtual World[788:10a03] -[Treasury setOwnership:]: unrecognized selector sent to instance 0x7498cc0 
2011-11-07 18:45:29.022 Virtual World[788:10a03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Treasury setOwnership:]: unrecognized selector sent to instance 0x7498cc0' 
*** First throw call stack: 
(0x17fb052 0x198cd0a 0x17fcced 0x1761f00 0x1761ce2 0xcbe33 0xc2193 0xc1e5f 0xc1a34 0x3fc81 0xc185e 0x176151d 0x1761437 0x39b25 0x36ee2 0x17fcec9 0x91f91 0x92adf 0x94991 0x869a30 0x869c56 0x850384 0x843aa9 0x27affa9 0x17cf1c5 0x1734022 0x173290a 0x1731db4 0x1731ccb 0x27ae879 0x27ae93e 0x841a9b 0xc07ef 0x20c5 0x1) 
terminate called throwing an exception(gdb) 

私はちょうど「国債」と呼ばれる別のNSMutableArrayのを作ることができることを知っているが、私は、可能な場合は、1つのアレイ内のすべてのものを維持したいと思います。 私は "House * h in structures"を繰り返し処理することを指定したにもかかわらず、それがまだ宝庫を通って繰り返す理由を知りたいのです。 下記の追加情報のコメントが必要な場合は追加します。 ありがとう!

+1

-1に変更する必要があります。 –

+0

ああ、ありがとう、私は今それを修正します。 – Telinir

+0

には、エラーを見つけるためのコードがさらに必要です。おそらくTreasuryクラスのコードも投稿するべきです。 – Raptor

答えて

4

次の構文でのObjective-Cでの高速列挙を使用する場合:

for (MyClass *item in someArray) { 
    ... 
} 

何がポインタとして各項目を処理し、上のアレイ内のすべてののアイテムをループしてやっていますMyClassオブジェクトには、が実際にアイテムであるかどうかにかかわらず、です。それはではなく、であると思います。ループ内で宣言した型の配列内の項目に対してのみ反復処理を行います。

はおそらく何を行う必要が別々の配列であなたのHouseTreasury項目を格納します。それらを同じ構造に置く特別な理由はありますか?

あなたが本当にそれらを一緒に保存したい場合は、あなたが使用することができます。

for (id item in structures) { 
    if ([item isKindOfClass:[House class]]) { 
     House *house = (House *) item; 
     [house setOwnership:...]; 
    } else { 
     continue; 
    } 
} 
+0

ありがとう、本当に私は速い列挙を理解する助けと私のコードで間違っていた。 – Telinir

+0

問題ありません@テリニール、助けてうれしい! –

+0

また、私は、 "構造"を全体として使用して変数を変更する機能がたくさんあったため、別々の高速列挙型で約6個の配列を実行するのは難しいでしょう。これはまさに私が望んでいたものです:D – Telinir

3

for(House *h in structures) 
    { 
     // Simplified to only show where the error occurs. 
     h.ownership = [self ReturnID]; // Error occurs here. 
     // The error ONLY occurs when it is iterating through a Treasury. 
    } 

のみ配列からハウスオブジェクトを選択することをお使いの仮定が間違っています。配列からすべてのオブジェクトを取得します。House *h in structuresは配列がHouseオブジェクトでいっぱいであることをコンパイラに伝えます。

あなたは(問題が何であったか、かなり正確にあなたに言っただろう)正確なエラーメッセージを引用しないため

for (id h in structures){ 
// Simplified to only show where the error occurs. 
    if ([h respondsToSelector:@selector(setOwnership:)]){ 
      h.ownership = [self ReturnID]; 
    } 
} 
+0

ありがとう!出来た。 -edit- Craigは状況をよりよく反映したソリューションを投稿しましたが、この方法も念頭に置いています。ありがとうございました! – Telinir

+0

問題ありません。そしてそれが私がチェックマークより+ 1が好きな理由です! –

+0

申し訳ありませんが、残念ながら+1できません。十分な評判を得ると、私はそれに慣れます。 – Telinir

関連する問題