2012-01-08 4 views
1

私は検索しましたが、これに対するアサートを見つけることができません。私はそれが私がここで欠けている基本的なものでなければならないことを知っている。Objective Cの列挙型が再割り当て時に変更されるオブジェクト

typedef enum { 
    NINETYBEND, NINETYBEND_FAST, NINETYBEND_SLOW, STRAIGHT 
} BlockTypeEnum; 

私は、このように作成していたオブジェクトでこれらの値を使用しようとしています:私は二度同じ変数を使用しようとすると

BlockTypeEnum blockType = STRAIGHT; 
XMLLevelPiece* piece = [[XMLLevelPiece alloc] init]; 
[piece initPiece:blockType]; 

私の問題が発生した

私は、列挙型を持っています。列挙型で1つのオブジェクトを作成し、列挙型を変更してから2番目のオブジェクトを作成すると、最初のオブジェクトの列挙型が2番目の列挙型の値に変更されます。これは私が望むものではありません。以下の例:私の知る限り理解されるように

BlockTypeEnum blockType = STRAIGHT; 

XMLLevelPiece* piece = [[XMLLevelPiece alloc] init]; 
[piece initPiece:blockType]; 

blockType = NINETYBEND_FAST; 

XMLLevelPiece* piece2 = [[XMLLevelPiece alloc] init]; 
[piece2 initPiece:blockType]; 

NSLog([NSString stringWithFormat:@"%d", [piece getBlockType]]); 
NSLog([NSString stringWithFormat:@"%d", [piece2 getBlockType]]); 

//BOTH BLOCK TYPES ARE NOW NINETYBEND_FAST, NOT WHAT I WANTED!! 

、列挙型は、単に見せかけint型ではなく、ポインタである、と私は、最初のオブジェクトに追加した後、変数を再割り当てしています。誰かが私に行方不明を教えてください!ありがとう、サイモン。

ここはXMLPieceのコードです。ありがとうございます!

#import "XMLLevelPiece.h" 
#import "BlockType.h" 
#import "GridCord.h" 
#import "BlockColor.h" 

@implementation XMLLevelPiece 

BlockTypeEnum mBlockType; 
BlockColorEnum mBlockColor; 
int mRotation; 
GridCord* mGridCords; 
BlockColorEnum mLeftColor; 
BlockColorEnum mTopColor; 
BlockColorEnum mRightColor; 
Boolean mRotatable; 
Boolean mMoveable; 
int mGroupID; 

-(id) init 
{ 
    if((self=[super init])) { 

    } 
    return self; 
} 

-(void)initPiece:(BlockTypeEnum)pBlockType pBlockColor:(BlockColorEnum)pBlockColor pRotation:(int)pRotation pGridCords:(GridCord*)pGridCords pLeftColor:(BlockColorEnum) pLeftColor pTopColor:(BlockColorEnum) pTopColor pRightColor:(BlockColorEnum) pRightColor pRotatable:(Boolean) pRotatable pMoveable:(Boolean) pMoveable pGroupID:(int) pGroupID 
{ 
    mBlockType = pBlockType; 
    mBlockColor = pBlockColor; 
    mRotation = pRotation; 
    mGridCords = pGridCords; 
    mLeftColor = pLeftColor; 
    mTopColor = pTopColor; 
    mRightColor = pRightColor; 
    mRotatable = pRotatable; 
    mMoveable = pMoveable; 
    mGroupID = pGroupID; 
} 

-(void)initPiece2 
{ 
    NSLog(@"poo"); 
} 

-(Boolean)getRotatable 
{ 
    return mRotatable; 
} 

-(Boolean)getMoveable 
{ 
    return mMoveable; 
} 

-(int) getGroupID 
{ 
    return mGroupID; 
} 

-(BlockColorEnum) getLeftColor 
{ 
    return mLeftColor; 
} 

-(BlockColorEnum) getTopColor 
{ 
    return mTopColor; 
} 

-(BlockColorEnum) getRightColor 
{ 
    return mRightColor; 
} 

-(BlockTypeEnum) getBlockType 
{ 
    return mBlockType; 
} 

-(BlockColorEnum) getBlockColor 
{ 
    return mBlockColor; 
} 

-(int) getRotation 
{ 
    return mRotation; 
} 

-(id) getGridCords 
{ 
    return mGridCords; 
} 

-(void) setRotatable:(Boolean) pRotatable 
{ 
    mRotatable = pRotatable; 
} 

-(void) setMoveable:(Boolean) pMoveable 
{ 
    mMoveable = pMoveable; 
} 

@end 
+0

何メソッド 'getBlockType'は見えますか? –

+0

XMLLevelPieceのコードを実際に見る必要があります。質問を編集してください。 – zaph

+0

私は 'init'を呼び出すのはかなり確信していますし、' initPiece'はあなたが望むものではありません。ほとんどの場合、 ' - (id)initWithPiece:(BlockTypeEnum)blockType;'が '[super init]'を呼び出すでしょう。 –

答えて

1

TL; DR

は答えがある - それはあなたがObjective-Cでアイバーズを定義する方法ではありません。私はそれがどのように動作するはずですが、私はすることができますあなたが持っているのと同じコードをすればエラーを再現します。

私はあなたが持っているように定義されているときにそれらの変数の動作/範囲が何であるべきかを説明するために、より多くの知識を持つ人に興味があります。


あなたが実際にinitPiece:を示していないそのコードの欠陥

がたくさんあります。

すべての議論を伴う長いinit...はおそらく悪い考えです。一般的に便宜的に、またはオブジェクトがそれなしでは機能しない場合にのみ、initに物を追加してください。

getの使用が本当に正しくないのObjective-C

クラスは、潜在的により

XMLLevelPiece.h

// You will need to import the header with the BlockTypeEnum defined 

@interface XMLLevelPiece : NSObject 

@property (nonatomic, assign) BlockTypeEnum blockType; 
// .. Other properties 

- (id)initWithPiece:(BlockTypeEnum)blockType; // I'm not so sure you need this 

@end 

XMLLevelPiece.m

のように定義されるべきである

#import "XMLLevelPiece.h" 
#import "BlockType.h" 
#import "GridCord.h" 
#import "BlockColor.h" 

@implementation XMLLevelPiece 

@synthesize blockType = mBlockType; 

- (id)initWithPiece:(BlockTypeEnum)blockType; 
{ 
    self = [super init]; 
    if (self) { 
     mBlockType = blockType; 
    } 
    return self; 
} 

@end 
あなたは、専用の初期化子を廃止することができれば、

2012-01-08 15:29:31.782 Untitled[1297:707] 3 
2012-01-08 15:29:31.791 Untitled[1297:707] 1 

オプション観測

は、その後、あなたは私に結果を得るためには

BlockTypeEnum blockType = STRAIGHT; 

XMLLevelPiece *p1 = [[XMLLevelPiece alloc] initWithPiece:blockType]; 

blockType = NINETYBEND_FAST; 

XMLLevelPiece *p2 = [[XMLLevelPiece alloc] initWithPiece:blockType]; 

NSLog(@"%d", p1.blockType); 
NSLog(@"%d", p2.blockType); 

のようにそれを使用することができます使用方法は次のようになります。

01ローカル blockType変数を削除し、まっすぐオブジェクトに値を割り当てることができます余分に数行を削除するには
BlockTypeEnum blockType = STRAIGHT; 

XMLLevelPiece *p1 = [[XMLLevelPiece alloc] init]; 
p1.blockType = blockType; 
// all other assignments 

blockType = NINETYBEND_FAST; 

XMLLevelPiece *p2 = [[XMLLevelPiece alloc] init]; 
p2.blockType = blockType; 
// all other assignments 

NSLog(@"%d", p1.blockType); 
NSLog(@"%d", p2.blockType); 

XMLLevelPiece *p1 = [[XMLLevelPiece alloc] init]; 
p1.blockType = STRAIGHT; 
+0

こんにちは。ありがとうございました。私はかなり馬鹿げたコードを知っていて、私はプロパティを使用してリファクタリングする予定でした。私はjavaからポートを実行して、説明されている問題にヒットしました。そこには多くの悪い練習がありますが、私はまだ問題の原因を見ることができません。私はちょうどあなたのアドバイスを使用してリファクタリングし、それについて心配しないようにする必要があります:)ありがとうSimon –

+0

まあ問題は、どのように対物レンズでivarsを定義するではありません - cです。どのように振る舞うのかさえ分かりませんが、あなたと同じコードを書くとエラーを再現できます。 –

+0

ありがとうございました。私はクラスをリファクタリングして、すべてが期待どおりに動作しています。私のレッスンを学び、言語の習慣を使いましょう。私はそれらのクラスのまっすぐなポートを行い、論理の違いを見ることができなかったので、それは私を投げた。私は残りの部分をリファクタリングして過ごすつもりです。もう一度ありがとう、サイモン。 –

1

initWithPieceへのメソッド呼び出しは、定義と一致しません。

コール:

[piece initPiece:blockType]; 

定義:

-(void)initPiece:(BlockTypeEnum)pBlockType pBlockColor:(BlockColorEnum)pBlockColor pRotation:(int)pRotation pGridCords:(GridCord*)pGridCords pLeftColor:(BlockColorEnum) pLeftColor pTopColor:(BlockColorEnum) pTopColor pRightColor:(BlockColorEnum) pRightColor pRotatable:(Boolean) pRotatable pMoveable:(Boolean) pMoveable pGroupID:(int) pGroupID 

コメント:

一般的な方法には、いくつかのパラメータが最高の貧しい人々のアイデアよりも多くを呼び出します。おそらくこの場合、個々のセッターを使用する方が良いでしょう。

Apple社のObjective-Cの規約は、「get」という接頭辞を付けずにgetterに名前を付けることです。実際にget接頭辞は、戻り値ではなく、参照パラメータを介して返された値を示します。このような使用法は、アナライザを混乱させ、ARCを使用する場合に問題を引き起こします。

+0

こんにちは。申し訳ありませんが、問題の内容を明確にするために、最初のコード例の定義を省略しました。私は現在、Androidプロジェクトを移植していますが、まだゲッターをリファクタリングする必要はありません。私はARCを使用しているので、getBlockTypeをtheBlockTypeにリネームしようとしましたが、私はまだ同じ問題を抱えています。名前に「get」を使用することで問題が発生する可能性はないので、ありがとうございました。残念ながら、それは問題ではないようです。 –

+0

'getBlockType'の代わりに、通常のコーディングは単純に' blockType'です。 setterメソッドの名前は 'setBlockType'です。これはあなたのエラーではなく、うまくいけば「役に立つヒント」です。 – zaph

関連する問題