2010-02-04 5 views
0

첫번째 그냥 개념 설명 :NSArray를

I 텍스트 파일 (단어 목록)에서 입력을 읽고 componentsSeparatedByString 방법을 사용하여 NSArray에이 말을 걸었습니다. 이 작동합니다.

하지만 단어를 임의로 선택한 다음 배열에서 삭제하여 매번 다른 단어를 사용하고 싶었습니다. 물론 NSArray 내용을 변경할 수는 없습니다. 그래서 ...

NSArray의 내용을 NSMutableArray으로 복사하고 선택 소스로 IT를 사용합니다. 이것은 또한 각 배열의 객체 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]; // 내가 arrMutTextWords에서 어떻게 든 삭제 문자열이 NSArray 무효화되는 것을 생각하고 단어

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

에 대한 TMP 저장소 -하지만 난이 발생할 수있는 방법을 생각할 수 없다.

+0

모든 코드 줄 앞에 4 개의 공백을 추가하십시오. 일부 코드가 StackOverflow 편집 컨트롤에 의해 처리되지 않는 것처럼 보입니다. –

답변

4

문제의 원인 중 하나는 목록에서 NSString 개체를 가져 와서 제거하는 것입니다. 그것을 제거하면 NSString 인스턴스가 해제되어 참조를 무효화합니다.

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

그런데 :

대신이 코드 시퀀스를 사용해야에 대한 참조를 유지하기 위해 SHURE 수하는 대신 손으로 모든 값을 복사하는

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray: array]; 

를 사용해야합니다. 내가 NSMutableArray의 구현을 알지 못하는 사이에, 나는 오래 전에 (NeXTstep) 몇 가지 가능한 최적화가 있다는 것을 알고 있으며, 기본 동작 인 NSArray의 속도를 높일 수 있습니다.

마지막으로이 방법을 복사하는 것이 훨씬 간결합니다.

+0

답장을 보내 주셔서 대단히 감사드립니다. 제가 확인하겠습니다. 이 문제에 대한 정보를 얻을 수있는 정보 소스를 알려주시겠습니까? – user266429

+0

이 항목을 다루는 NSArray 클래스 참조의 NSArray 및 NSMutableArray에 대한 메모리 비헤이비어 비헤이비어 섹션이 있습니다. 추가 정보 "Collections Programming Topics for Cocoa"를 정기적으로 읽으면 Java에서 Objective-C로 돌아갈 수 있습니다. –

+0

너 다 남자 야! 지금 코드를 연결하고 있습니다. – user266429

0

그냥 XCode를 통해 이것을 실행하고 임의의 단어가 반환되었지만 전체 for 루프를 건너 뛰고 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