此处的完整类别代码: 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");
}
}
}
它应该记录“repeat”'spriteNumber'的次数,只要字符串'spriteType'具有'typeOne'的内容,但没有任何反应。它不记录“重复”,但也没有任何错误。字符串'sprite type'的内容绝对是'typeOne'和spriteNumber&gt; 0
可以采取哪些措施来解决这个问题?
编辑:我现在尝试了这样的代码:
- (void) initSprite {
for(int i = 0; i<spriteNumber; i++) {
if ([spriteType isEqualToString:@"typeOne"]) {
NSLog(@"repeat");
}}}
返回错误EXC_BAD_ACCESS
答案 0 :(得分:5)
我已经等了很长时间才有理由使用这个关于编程世界中两种类型的平等的愚蠢故事。想象一下,你和你的重要人物一起去野餐。你深深爱着,所以你可以分享一份午餐供你们分享。如果有人要求你指出你的午餐,你们都会指向相同的午餐。你的午餐彼此==
。现在让我们说你是大食客,所以你打包两个不同的午餐,内容相同。现在当有人要求你指点午餐时,你会指出不同的午餐。你的午餐是!=
。但是,如果你看一下里面的午餐里面有什么样的食物,它们仍然有相同的内容。他们彼此[isEqualTo]
。你知道我要去哪儿吗?
午餐是一个对象,你和你的重要人物都是指针。当你使用==
时,你会测试指针等价(即哪个是午餐),但这通常不是你想要的。你想要对象等价(即午餐中的食物)。
总之,使用[isEqualTo]
而非==
- &gt; if([spriteType isEqualToString:@"typeOne"])
答案 1 :(得分:3)
不要将==运算符用于字符串。使用
if [string1 isEqualToString:string2]
答案 2 :(得分:3)
编辑:Re。保留spriteType的值。
看起来好像是在尝试将spriteType用作类变量但是在设置它的值时不保留它。
spriteType = [NSMutableString stringWithFormat:@"typeOne"];
stringWithFormat:将返回一个自动释放的NSString,它不能在调用它的方法范围之外访问。
让spriteType在整个类中运行的最简单方法是将其声明为@property - 在这两种情况下,您都需要在.h文件中声明属性。在.m文件中合成它。
ARC
@property(非原子,强)NSString * spriteType;
NON ARC - 您将负责释放dealloc中的值
@property(nonatomic,retain)NSString * spriteType;
ORIGINAL:
在NSString上使用==将测试字符串的两个实例是否确实相同(指针等效)。
你需要使用NSString方法 isEqualToString:来测试对象等价,就像这样 -
if ([spriteType isEqualToString:@"typeOne"])
isEqualToString:互相测试字符串变量的内容....
答案 3 :(得分:0)
您确定randomSpriteNumber = arc4random() % 2+1;
符合您的想法吗?在Objective C中,“+”的优先级高于模数运算符(参见http://www.techotopia.com/index.php/Objective-C_2.0_Operator_Precedence),因此有效%3
- 因此允许返回0,1或2。处理0。