2016-01-22 148 views
1

我有一个包含NSString对象的NSArray。我想从这些字符串创建一个NSString **对象。如何将NSArray转换为NSString **

NSArray * myArray = [NSArray arrayWithObjects:@"a",@"b",@"c",nil]; 
NSString ** myStrings = ??? // an array of NSString* 

有没有非malloc解决方案?我们可以以某种方式在autorelease池中分配myStrings,或者获取myArray中的objects属性的句柄并使用它?

+0

你看看http://stackoverflow.com/questions/7962149/strange-values-in-an-int-array-instance-variable-in-objective-c?烦人的部分将是你可能不习惯的malloc/free,由于ARC – luk2302

+0

@ luk2302很好的参考,但我正在寻找一个非malloc解决方案(如果存在的话) - 我将编辑问题 – andrewz

+3

有可能没有' t one – luk2302

回答

3

免责声明:您不应该这样做。

这就是说,这里是如何从一个NSArray,通过自动释放内存支持创建的NSString指针的C数组:

NSArray * myArray = [NSArray arrayWithObjects:@"a",@"b",@"c",nil]; 
NSMutableData * myData = [NSMutableData dataWithLength:(sizeof(NSString *) * myArray.count)];  
NSString ** myStrings = myData.mutableBytes; 
for (int i = 0; i < myArray.count; i++) { 
    myStrings[i] = myArray[i]; 
} 

这是一个可怕的想法,从存储管理的角度来看。

每个myStrings[i]值将只适用于只要myArray被保留,并myStrings值将只适用于只要myData被保留。

在ARC下,myArraymyData对象一旦超出范围就会被释放,因此myStrings一旦从方法返回就会指向free'd内存。

+0

你在这里向我展示我不知道的东西(NSMutableData)。在调用函数中有一个明确的自动释放池块,所以我的猜测是你的解决方案是正确的,因为他们没有使用ARC。 – andrewz