我想创建一个包含指向 NSStrings 指针的动态二维 c 数组的类。我知道我可以使用包含多个 NSArray 的 NSArray 来模拟二维数组,但如果可能的话,我想使用传统的二维 c 数组来模拟二维数组。除非您使用“__unsafe_unretained”,否则 ARC 不允许将指向 NSString 的指针简单分配给 c 数组的元素:
@interface NumberStringsArray : NSObject
{
@public
NSString * __unsafe_unretained **_array;
}
为了避免内存泄漏并在分配给 c-array 的每个 NSString 的类中赋予对象所有权,我将指向每个 NSString 对象的指针添加到 NSMutableArray。在 -(void)dealloc 中,我释放了获取的内存以创建二维 c 数组。
这是我的问题:如何根据 _array ivar 声明一个属性,以便我可以将数组的 i,j 元素称为“foobar.array[i][j]”而不是“foobar->array[i ][j]”?
后来的放大:除了 __bridge 的东西外,我以与回答者非常相似的方式完成了它。我不知道这是否有区别。我在这里分配二维数组:
self->_array = (NSString * __unsafe_unretained **)calloc(_columnCount, sizeof(void *));
if (!self->_array)
return nil;
for (UINT16 i = 0; i < _columnCount; i++)
{
self->_array[i] = (NSString * __unsafe_unretained *)calloc(_rowCount, sizeof(void *));
if (!self->_array[i])
{
for (UINT16 a = 0; a < _columnCount; a++)
if (self->_array[a])
free(self->_array[a]);
if (self->_array)
free(self->_array);
return nil;
}
}
我使用从逗号分隔值文件生成的子字符串将指向 NSString 对象的指针放入数组中:
NSArray *numbers = [line componentsSeparatedByString: @","];
for (UINT16 i = 0; i < _columnCount; i++)
{
NSString *number = @"";
if (i < [numbers count])
number = [numbers objectAtIndex: i];
//
// save it in owners
//
[self.owners addObject: number];
self->_array[i][j] = number;
}
在 -(void)dealloc 我释放所有内存:
-(void)dealloc
{
for (UINT16 i = 0; i < self.columnCount; i++)
if (self->_array[i])
free(self->_array[i]);
if (self->_array)
free(self->_array);
}