@Dave 덕분에, NSArray에서 포인터를 추출하는 솔루션을 찾았습니다. 포함 된 유형에 관계없이 복잡한 작업을 수행 한 다음 void * 유형을 사용하여 포인터를 다시 어셈블합니다.
Objective-C++ 기능을 사용하려면 .m 파일의 이름을 .mm으로 바꿉니다.
void *array[[self count]]; //create an empty void* array
for (uint i = 0; i < [self count]; i++)
{
int address = (int)[self objectAtIndex:i];
array[i] = (void *)address; //insert NSObjects pointers into void* array
}
은 다음과 같이 진행 무효 * 배열에서 NSObjects을 다시 얻으려면 :
NSMutableArray *doneAr = [[NSMutableArray alloc] init]; //create a NSMutableArray
for (uint i = 0; i < [self count]; i++)
{
void *tmp = (void **)done + i; //extract the pointer in the void* array
NSString *strTmp = (NSString *)(*((Class *)tmp)); //convert it back to origin type (here NSString *)
[doneAr addObject:strTmp]; //add it back to the previously created NSMutableArray
}
희망이 답변이 미래의 문제에 대한 도움이 될 수 있습니다. C++ 구현에서 나 같은 NSComparator를 사용하려면 Objective-C++ 기능을 사용할 수 있도록 .m 파일의 이름을 .mm 파일로 바꿉니다. 그런 다음 필요한 것을 가져와 사용하십시오 (예 : NSComparator).
정적으로 입력하는 속도와 동적으로 입력 할 수있는 유연성을 둘 다 가질 수는 없습니다. 가장 빠른 솔루션은 템플릿과 일부 오버로드 된 비교 기능을 사용하는 것입니다. 두 번째로 빠른 방법은 함수 포인터를 습지 표준 C 함수에 보내는 것입니다. 또한 매크로를 사용하고 싶을 수도 있습니다 (좋은 QSORT-as-a-macro가 매우 좋은 성능을 제공합니다) – Dave
좋아, 나는 어떤 종류의 객체가 있더라도 C++에서 포인터를 움직일 수있을 것으로 기대하고있었습니다. 각 메모리 조각 (사용자 지정 개체 여부). C++ 구현은 flexivity를 유지하는 올바른 해결책으로 보이지 않습니다. 바로 Objective-C에서이를 수행 할 것입니다! 답장을 보내 주셔서 감사합니다 @Dave! –
하실 수 있습니다. 그러나 문제는 비교 기능을 호출 할 수 있습니다. 예를 들어, 아무 문제없이 목록을 되돌릴 수 있습니다. – Dave