2009-11-23 3 views
5

objective-c에서 배열 내의 포인터와 관련된 문제가 발생했습니다.역 참조로 NSArray 내의 값을 변경 하시겠습니까?

내가 뭘하려는 것은 NSArray에서 포인터를 가져 와서 메서드에 전달한 다음 반환 된 값을 원래 포인터 (배열에 속한 포인터)에 다시 할당하는 것입니다.

내가 C 및 C++에서 알고있는 것을 바탕으로, 배열 내의 포인터를 역 참조함으로써, 포인터가 가리키는 값을 변경할 수 있어야합니다. 사용중인 코드는 다음과 같습니다. 그러나 작동하지 않습니다. (가치 전화는 NSLog 출력에 따라 절대 변경되지 않습니다). 변수 전화 PHONENUMBERS 내의 각는 NSString *을 통해 당신이 볼 수 있듯이

- (NSString*) removeNonNumbers: (NSString*) string; 

, 내가 반복하고 여기

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"]; 
    for (NSString* phone in phoneNumbers) { 
     (*phone) = (*[self removeNonNumbers:phone]); 
     NSLog(@"phone:%@", phone); 
    } 

그리고

내가에있는 NSString *을 통과하고있는 메소드 서명입니다. 전화를 removeNonNumbers :로 전달하면 수정 된 NSString *이 반환됩니다. 그런 다음 removeNonNumber에서 반환 된 포인터를 역 참조하고 전화에 값을 할당합니다.

여러분도 알다시피, Objective-C 객체를 잘 이해하지 못했을 것입니다. 나는 이것이 C++이나 C에서 작동 할 것이라고 확신하지만, 왜 여기서 작동하지 않는지 나는 알 수 없다! 도와 주셔서 미리 감사드립니다.

답변

13

예, 작동하지 않습니다. 이것은 어느 정도 일 수 있지만 나는 '좋은 생각'에서이 파일 및 만지지 것, 나는 그것을 테스트하지 않았습니다,

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy]; 
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) { 
    NSString * phone = [phoneNumbers objectAtIndex:i]; 
    phone = [self removeNonNumbers:phone]; 
    [phoneNumbers replaceObjectAtIndex:i withObject:phone]; 
} 
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"]; 
[phoneNumbers release]; 
2

NSArray은 C/C++ 스타일 배열이 아닙니다. 이것은 Objective-C 객체입니다. 조작을 수행하려면 클래스의 instance methods을 사용해야합니다.

Objective-C에서는 결코 값을 설정하기 위해 객체 포인터를 "참조 해제"하지 않습니다.

또한 돌연변이를 허용하지 않는 Fast Enumeration을 사용하고 있습니다.

0

: 당신은 NSMutableArray가 필요합니다. NSArray 및 기타 많은 코코아 개체는 매우 복잡하며 클래스 클러스터 디자인 패턴의 일부로 다양한 구현을 가질 수 있습니다.

그래서 내면에 어떤 것을 처리하고 있는지 알 수 없습니다. NSArray는 실제로 변경할 수 없도록 설계되었으므로 장소 편집은 두 배나 나쁜 생각입니다.

내부와 함께 어지럽게 만들 수 있도록 설계된 객체는 NSMutableDatamutableBytes과 같은 API 메소드를 통해 노출됩니다.

처리 된 값을 사용하여 새로운 NS (가변 길이) 배열을 만드는 것이 더 낫습니다.

4

Objective-C 개체 변수를 참조 할 수 없습니다. 그들은 항상 포인터지만, 원자 값처럼 취급해야합니다. 생성하려는 새 객체를 포함하도록 배열 자체를 변경해야합니다.

1

enumerateObjectsUsingBlock:을 사용할 수도 있습니다.

NSArray *array = [NSArray array]; 
__block NSMutableArray *mutableCopyArray = [array mutableCopy]; 
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) { 
    [mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]]; 
}]; 

체크 아웃 How do I iterate over an NSArray?

관련 문제