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");
        }   
    }  
}

它应该记录“重复”“spriteNumber”的次数,只要字符串“spriteType”的内容为“typeOne”,但什么也没有发生。它不记录“重复”,但也没有任何错误。字符串'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

我已经等了很长时间才使用这个我想出的关于编程世界中两种类型的平等的愚蠢故事。想象一下,你和你的另一半一起去野餐。你深爱着,所以你打包一份午餐让你们俩分享。如果有人要你指着你的午餐,你们都会指着同一份午餐。你们的午餐是==彼此的。现在假设你是大食客,所以你打包了两种不同的午餐,内容相同。现在当有人让你指点你的午餐时,你会指着不同的午餐。你的午餐是!=。但是,如果你看看里面的午餐是什么食物,它们的内容还是一样的。他们是[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;

NON ARC -你将负责释放 dealloc 中的值

@property (nonatomic, 保留) NSString* spriteType;

原来的:

在 NSString 上使用 == 将测试 string 的两个实例是否确实相同(指针等效)。

您需要使用 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 回答