Ну, грубые шаги могут быть:
использовать count метод NSArray, чтобы узнать, сколько NSStrings есть в NSArray.
используйте malloc для выделения памяти для карго, что-то вроде этого
char **cargs = (char **) malloc(sizeof(char *) * count);
в вашем примере, вам может понадобиться еще одно место для NULL, которое будет в конце карго.
использовать цикл и objectAtIndex: NSArray, чтобы получить NSStrings, например NSString * nsstring = [массив objectAtIndex: index];
используйте метод cStringUsingEncoding: , чтобы получить c-строку, лучше сделайте копию
поместите эти указатели c-строки в карго
передать груз в вашу функцию, очистить и освободить вещи, необходимые для.
Это много работы.Потому что смесь c и obj-c.И много ручного malloc и свободных, грязных вещей.Разве вы не можете избежать этого?
- добавить пример кода -
Я не совсем уверен, каково ваше истинное намерение.Надеюсь, это поможет.
void func(char **arg)
{
int i;
for(i = 0; arg[i] != NULL; i++) {
printf("%d=%s\n", i, arg[i]);
}
}
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *s1 = [NSString stringWithString:@"first"];
NSString *s2 = [NSString stringWithString:@"second"];
NSString *s3 = [NSString stringWithString:@"third"];
NSArray *array = [NSArray arrayWithObjects: s1, s2, s3, nil];
//by now, we have an NSArray of three NSStrings
int count = [array count];
char **cargs = (char **) malloc(sizeof(char *) * (count + 1));
//cargs is a pointer to 4 pointers to char
int i;
for(i = 0; i < count; i++) {
NSString *s = [array objectAtIndex:i];//get a NSString
const char *cstr = [s cStringUsingEncoding:NSUTF8StringEncoding];//get cstring
int len = strlen(cstr);//get its length
char *cstr_copy = (char *) malloc(sizeof(char) * (len + 1));//allocate memory, + 1 for ending '\0'
strcpy(cstr_copy, cstr);//make a copy
cargs[i] = cstr_copy;//put the point in cargs
}
cargs[i] = NULL;
func(cargs);//call the function to do something
for(i = 0; i < count; i++) {
free(cargs[i]);
}
free(cargs);
[pool drain];
return 0;
}