0

完全なクラス コードはこちら: http://pastebin.com/rdjDGLJS

編集:元のポスターのコメントから取得した最新のコード スニペット

NSMutableString *spriteType;


- (void) pickSpriteType {

    randomSpriteNumber = arc4random() % 2+1;

    switch (randomSpriteNumber) {
        case 1:
            spriteType = [NSMutableString stringWithFormat:@"typeOne"];
            break;

        case 2:
            spriteType = [NSMutableString stringWithFormat:@"typeTwo"];
            break;
    }
}


- (void) findSpriteNumber {

    levelNumberString = [NSMutableString stringWithFormat:@"%d",levelNumber];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"plist_enemies" ofType:@"plist"];
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
    spriteNumber = [[[dict objectForKey:spriteType] objectForKey:levelNumberString] intValue];
}


- (void) initSprite {
    [self moveUp];
    for(int i = 0; i<spriteNumber; i++) {
        if ([spriteType isEqualToString:@"typeOne"]) {
            NSLog(@"repeat");
        }
        if ([spriteType isEqualToString:@"typeTwo"]) {
            NSLog(@"repeat");
        }
    }
}

元の投稿:

次のコードを使用して、NString で if ステートメントを使用しています。

- (void) initSprite {
    for(int i = 0; i<spriteNumber; i++) {
        if (spriteType == @"typeOne") {
            NSLog(@"repeat");
        }   
    }  
}

文字列「spriteType」の内容が「typeOne」である限り、「繰り返し」「spriteNumber」の回数をログに記録する必要がありますが、何も起こりません。「繰り返し」はログに記録されませんが、エラーもありません。文字列 'sprite type' の内容は間違いなく 'typeOne' で、spriteNumber > 0 です。

この問題を解決するにはどうすればよいですか?

編集:私は今、次のようなコードを試しました:

- (void) initSprite {
for(int i = 0; i<spriteNumber; i++) {
if ([spriteType isEqualToString:@"typeOne"]) {
    NSLog(@"repeat");
}}}

エラー、EXC_BAD_ACCESS を返します。

4

4 に答える 4

5

私は、プログラミングの世界における 2 つのタイプの平等に関して思いついたこのばかげた話を使用する理由を長い間待っていました。あなたと大切な人が一緒にピクニックに行くと想像してみてください。あなたは深く恋をしているので、二人で分かち合うために1つのランチを詰めます。誰かがあなたの昼食を指さすように頼まれたら、あなたは両方とも同じ昼食を指すでしょう. あなたの昼食は==お互いにあります。ここで、あなたが大食いで、同じ内容の 2 つの異なるランチを詰めたとします。誰かがあなたの昼食を指さすように頼んだら、あなたは別の昼食を指します. あなたのランチは!=です。しかし、お弁当の中身を見てみると、中身は同じ。彼らは[isEqualTo]お互いです。私がこれでどこに行くのか分かりますか?

ランチはオブジェクトであり、あなたとあなたの大切な人はポインターです。を使用するときは、ポインタの等価性(つまり、どのランチか) をテストします==が、通常、それは望んでいるものではありません。オブジェクトの同等性(つまり、ランチの食べ物) が必要です。

結論として、使用し、使用[isEqualTo]しない==->if([spriteType isEqualToString:@"typeOne"])

于 2012-05-23T08:43:39.907 に答える
3

文字列には==演算子を使用しないでください。使用する

if [string1 isEqualToString:string2]
于 2012-05-23T08:25:25.890 に答える
3

編集:再。spriteTypeの値を保持します。

spriteTypeをクラス変数として使用しようとしているように見えますが、値を設定するときにそれを保持しません。

spriteType = [NSMutableString stringWithFormat:@"typeOne"];

stringWithFormat:自動リリ​​ースされたNSStringを返します。これは、呼び出されたメソッドのスコープ外ではアクセスできません。

spriteTypeをクラス全体で機能させる最も簡単な方法は、@ propertyとして宣言することです。どちらの場合も、.hファイルでプロパティを宣言し、.mファイルで合成する必要があります。

アーク

@property(nonatomic、strong)NSString * spriteType;

非アーク-deallocで値をリリースする責任はあなたにあります

@property(非アトミック、保持)NSString * spriteType;

オリジナル:

NSStringで==を使用すると、文字列の2つのインスタンスが実際に同じであるかどうかがテストされます(ポインタの同等性)。

このようなオブジェクトの同等性をテストするには、NSStringメソッドisEqualToString:を使用する必要があります-

if ([spriteType isEqualToString:@"typeOne"])

isEqualToString:文字列変数の内容を相互にテストします...。

于 2012-05-23T08:27:03.417 に答える
0

あなたは自分が思っていることを本当にやってrandomSpriteNumber = arc4random() % 2+1;いますか?Objective C では、「+」はモジュラス演算子よりも優先順位が高いため ( http://www.techotopia.com/index.php/Objective-C_2.0_Operator_Precedenceを参照)、これは効果的%3です。つまり、0 を返すことができます。 、1、または 2。0 は扱いません。

于 2012-05-27T10:31:38.867 に答える