我遇到了数组问题,我希望从数组中随机选取一个对象, 然后删除它并删除“if”语句中指定的其他对象。
我做了什么..
中的.h
NSMutableArray *squares;
int s;
NSString *randomN;
接下来,在.m
中创建一个新数组:
-(void) array{
squares = [[NSMutableArray alloc] arrayWithObjects: @"a", @"b", @"c", nil];
}
然后选择一个随机对象,如果满足“if”的属性,则从数组中删除该对象,再次执行while循环。
-(void) start{
s=5;
while (s > 0){
//I even tried it without the next line..
randomN = nil;
//Also tried the next line without ' % [squares count'
randomN = [squares objectAtIndex:arc4random() % [squares count]];
if (randomN == @"a"){
[squares removeObject: @"a"];
[squares removeObject: @"b"];
s = s - 1;
}
if (randomN == @"b"){
[squares removeObject: @"b"];
[squares removeObject: @"c"];
s = s - 1;
}
if (randomN == @"c"){
[squares removeObject: @"c"];
s = s - 1;
}
else {
s=0;
}
}
}
当我运行应用程序时,应用程序会在循环开始后停止并退出。
你能帮帮我吗?
答案 0 :(得分:2)
我认为问题是你在创建数组时应该使用initWithObjects
(而不是arrayWithObjects
)。
使用init*
创建新对象后,应始终使用alloc
方法。
arrayWith*
方法是'便捷构造函数',autorelease
返回的对象。当你使用它时,阵列可能已被释放。
答案 1 :(得分:2)
在objective-c中,您无法使用==
比较字符串,您必须使用isEqual:
方法。 @"string"
表示法生成一个指向内存中其他地方定义的字符串的指针,这些指针可能不同,即使它们指向的数据是相同的。
所以,而不是
if (randomN == @"a"){
试
if ([randomN isEqual:@"a"]){
答案 2 :(得分:2)
他们的一些问题可能会让你失望:
您正在使用便捷构造函数初始化已分配的数组,您应该选择alloc
/ init
对中的一个或方便构造函数:
[[NSMutableArray alloc] initWithObjects:...]
或:
[NSMutableArray arrayWithObjects:...]
您的删除行正在尝试删除字符串文字。虽然您的数组包含字符串实例,其中包含与您尝试删除的字符串相同的值,但它们与字符串的确切实例不同。您需要使用[stringVar isEqualToString:otherStringVar]
来比较值而不是它们的引用:
if ([randomN isEqualToString:@"a"])
而不是:
if (randomN == @"a")
此外,由于与第二个问题类似的原因,您的else
语句会每次触发。即使您使用正确的字符串比较,如果您尝试仅执行这4个代码块中的一个,那么您的逻辑可能已关闭。要做到这一点,第一个if
之后的每个else
都需要一个if (/* test 1 */) {
}
else if (/* test 2 */) {
}
else if (/* test 3 */) {
}
else {
// chained else's make only one block able to execute
}
,如下所示:
if (/* test 1 */) {
}
if (/* test 2 */) {
}
if (/* test 3 */) {
}
else {
// this else only applies to the LAST if!
}
而不是:
{{1}}
答案 3 :(得分:1)
正如亚历克斯所说,
squares = [[NSMutableArray alloc] arrayWithObjects: @"a", @"b", @"c", nil];
此行应为
squares = [[NSMutableArray alloc] initWithObjects: @"a", @"b", @"c", nil];
或
squares = [[NSMutableArray arrayWithObjects: @"a", @"b", @"c", nil] retain];
此外,
randomN = [squares objectAtIndex:arc4random() % [squares count]];
如果square为空,则在此行上发生EXC_ARITHMETIC异常(除以零)。