2011-02-24 65 views
0

我遇到了數組問題,我想從數組中隨機選取一個對象,然後將其刪除並刪除在「if」語句中指定的其他對象。從數組中獲取隨機對象,然後將其從數組中移除。 iphone

我做什麼..

在.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; 
    } 
} 
} 

當我運行應用程序時,應用程序停止並在循環開始時立即退出。

你能幫我嗎?

回答

2

他們是被絆倒可能您幾個問題:

你初始化已經分配的數組與便利構造函數,你應該選擇其中一個alloc/init對或簡單的構造函數:

[[NSMutableArray alloc] initWithObjects:...] 

或:

[NSMutableArray arrayWithObjects:...] 

你刪除線正在試圖刪除字符串文字。雖然您的數組包含字符串實例,它們包含與您要刪除的字符串相同的,但它們不是字符串的完全相同實例。您需要使用[stringVar isEqualToString:otherStringVar]的值進行比較,而不是他們的參考文獻:的

if ([randomN isEqualToString:@"a"]) 

代替:

if (randomN == @"a") 

此外,您else聲明將火出於同樣的原因是第二個問題,每次。即使你使用了正確的字符串比較,如果你試圖只執行這4個代碼塊中的一個,你的邏輯可能是關閉的。爲了實現這個目標,每個第一後if S的需要一個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! 
} 
+0

感謝球員的答案,,我做了你告訴我的每件事情,現在它正在工作:)非常感謝你 – 3madi 2011-02-24 04:05:29

2

我認爲問題在於創建數組時應該使用initWithObjects(而不是arrayWithObjects)。

在使用alloc創建新對象後,您應始終使用init*方法。 arrayWith*方法是'便利的構造函數'autorelease返回的對象。到你使用它的時候,陣列可能已經被釋放了。

+0

感謝球員的答案,,我做了你告訴我的每件事,現在它正在工作:)非常感謝你 – 3madi 2011-02-24 04:05:51

2

在objective-c中,您無法使用==比較字符串,因此您必須使用isEqual:方法。 表示法會生成一個指向在內存中其他位置定義的字符串的指針,並且這些可以不同,即使它們指向的數據是相同的。

所以,與其

if (randomN == @"a"){ 

嘗試

if ([randomN isEqual:@"a"]){ 
+0

感謝球員的答案,,我做了你告訴我的每一件事,現在它正在工作:)非常感謝你 – 3madi 2011-02-24 04:04:35

1

正如亞歷克斯說,

squares = [[NSMutableArray alloc] arrayWithObjects: @"a", @"b", @"c", nil]; 

此行應be

squares = [[NSMutableArray alloc] initWithObjects: @"a", @"b", @"c", nil]; 

squares = [[NSMutableArray arrayWithObjects: @"a", @"b", @"c", nil] retain]; 

此外,

randomN = [squares objectAtIndex:arc4random() % [squares count]]; 

如果方塊是空的,EXC_ARITHMETIC異常(除數爲零)在這條線發生。

+0

感謝球員的答案,,我做了你告訴我的每一件事,現在它正在工作:)非常感謝 – 3madi 2011-02-24 04:06:29