2010-02-04 61 views
0

只是概念性描述第一:NSArray的到的NSMutableArray作爲隨機堆

我讀從一個文本文件(單詞列表)的輸入,並使用componentsSeparatedByString方法將這些詞語成NSArray。這工作。

但我想隨機選擇單詞,然後從數組中刪除它們,以確保每次都有不同的單詞。當然,您不能更改NSArray的內容。所以......

我複製了NSArray的內容放入NSMutableArray和使用它的選擇源。這也適用 - 每個陣列中有269個對象。

要返回從NSMutableArray我使用下面的代碼字: 陣列筆記記錄被全局 作爲

arrMutTextWords = [[NSMutableArray alloc] init]; //stack for words 
arrTextWords = [[NSArray alloc] init]; //permanent store for words 


-(NSString*) getaTextWord 
{ 

// if the mutable text word array is empty refill 

if ([arrMutTextWords count] == 0){ 

    for (int i = 0 ; i < [arrTextWords count]; i++) 
     [arrMutTextWords addObject:[arrTextWords objectAtIndex:i]]; 
} 

int i = random() % [arrMutTextWords count]; 
NSString* ptrWord = [arrMutTextWords objectAtIndex:i]; 
[arrMutTextWords removeObjectAtIndex:i]; 
return ptrWord; 

}

以上所述方法的調用時的程序崩潰聲明 - 這裏是調用代碼: arrTmp是全局聲明的arrTmp = [[NSArray alloc] init]; // TMP商店話

for (int i = 0 ; i < 4; i++) { 
    tmpWord = [self getaTextWord]; 
    [arrTmp addObject:tmpWord]; 
    [arrTmp addObject:tmpWord]; 
} 

我在想,從某種程度上arrMutTextWords刪除字符串是無效的NSArray - 但我不認爲這會是如何發生的。

+0

請確保在每行代碼之前添加四個空格 - 它看起來像您的一些代碼沒有被StackOverflow編輯控件處理。 – 2010-02-04 20:00:15

回答

4

問題的一個可能來源是您從列表中提取並刪除NSString對象。刪除它會釋放NSString實例,從而使您的引用失效。

要舒爾保留您應使用此代碼序列而不是一個參考:

NSString * ptrWord = [[[arrMutTextWords objectAtIndex:i] retain] autorelease]; 
[arrMutTextWords removeObjectAtIndex:i]; 
return ptrWord; 

順便說一句:你應該用

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray: array]; 

,而不是手工複製的所有值。雖然我不知道NSMutableArray的實現,我從很久以前就知道(NeXTstep),有幾種可能的優化可能會加速基本的NSArray操作。

最後複製這種方式更加簡潔。

+0

非常感謝您的及時回覆。我會看看。你可以給我一些信息來源,在那裏我可以讀到這個問題? – user266429 2010-02-04 20:04:47

+0

有關處理此主題的NSArray類參考中的NSArray和NSMutableArray的內存管理行爲部分。 另外我建議「集合編程可可主題」我定期閱讀任何時候,我會得到從Java返回的Objective-C。 – 2010-02-04 20:13:47

+0

你達人!我正在插入你的代碼。 – user266429 2010-02-04 20:15:27

0

剛剛通過XCode運行此程序,並得到隨機單詞返回,但我跳過整個循環,並從NSMutableArray使用addObjectsFromArray

NSArray *randomArray = [[NSArray alloc] initWithObjects:@"Paul", @"George", @"John", nil]; 
NSMutableArray *muteArray = [[NSMutableArray alloc] init]; 
[muteArray addObjectsFromArray:randomArray]; 

int i = random() % [muteArray count]; 
NSString* ptrWord = [muteArray objectAtIndex:i]; 
[muteArray removeObjectAtIndex:i]; 
NSLog(@"ptrWord %@", ptrWord); //gave me a different name each time I ran the function. 

希望能夠解決一些問題。

+0

是的,addObjectsFromArray方便 - 我將從現在開始使用它。 – user266429 2010-02-04 21:09:45