【问题标题】:How to convert NSArray into NSString**如何将 NSArray 转换为 NSString**
【发布时间】:2016-01-22 21:27:53
【问题描述】:

我有一个包含 NSString 对象的 NSArray。我想从这些字符串中创建一个 NSString ** 对象。

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

有非 malloc 的解决方案吗?我们能否以某种方式在自动释放池中分配 myStrings,或者获取 myArray 中 objects 属性的句柄并使用它?

【问题讨论】:

  • 你看过stackoverflow.com/questions/7962149/… 吗?烦人的部分将是 malloc/free,由于 ARC,您可能不习惯
  • @luk2302 很好的参考,但我正在寻找一个非 malloc 解决方案(如果存在) - 我将编辑问题
  • 可能没有
  • 出于好奇,您使用的是什么需要 NSStrings 的 C 数组?
  • 你真的必须返回一个 NSStrings 数组还是仅仅返回一个 NSString** 这并不一定意味着你要将它用作一个数组。

标签: objective-c nsstring nsarray


【解决方案1】:

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

也就是说,您可以通过以下方式从 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 将在从方法返回后立即指向已释放的内存。

【讨论】:

  • 你在这里向我展示了一些我不知道的东西 (NSMutableData)。调用函数中有一个显式的自动释放池块,所以我猜你的解决方案是正确的,因为他们没有使用 ARC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多