1

我想创建一个包含指向 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);
}
4

3 回答 3

0

你不能,因为你不能为一个 Objective-C 类声明一个具体的对象。所以

NumberStringsArray object;

不允许。_

您被迫将其声明为

NumberStringsArray *object = [[NumberStringsArray alloc] init.. ];

->因此您必须通过应用于指针的正确运算符来访问 ivar 。请注意,object.somethingObjective-C 中的 只是[object something]标准 C 中.用于访问具体字段的简写struct

于 2012-12-06T00:41:48.087 回答
0

声明这个属性:

@property (nonatomic) NSString * __unsafe_unretained **_array;

然后您可以分配指向对象的指针:

_array= (NSString * __unsafe_unretained **) malloc(M*sizeof(CFTypeRef) );
for(NSUInteger i=0; i<M;i++)
{
    _array[i]= ((NSString * __unsafe_unretained *) malloc(N*sizeof(CFTypeRef) );
    for(NSUInteger j=0; j<N;j++)
    {
        _array[i][j]= (__bridge NSString*) (__bridge_retained CFTypeRef) [[NSString alloc]initWithCString: "Hello" encoding: NSASCIIStringEncoding];
        // I see that you got habit with C so you'll probably like this method
    }
}

然后当你不再需要它时,释放数组:

for(NSUInteger i=0; i<M; i++)
{
    for(NSUInteger j=0; j<N;j++)
    {
        CFTypeRef string=(__bridge_transfer CFTypeRef) _array[i][j];
    }
    free(_array[i]);
}
free(_array);
于 2012-12-07T19:32:32.673 回答
0

(注意:这解决了创建/使用属性来访问数据,而不是数据应该由传统的 Objective-C 存储管理或 ARC 管理的方式。想想这让我头疼。)

如果您希望只读 C 数组“看起来”像一个 Objective-C 属性,请声明该属性@property (readonly, nonatomic) char* myProp;,然后,而不是使用@synthesize,为它实现一个 getter,如下所示:

-(char**)myProp {
    return myPropPointer;
    // Or, if the array is allocated as a part of the instance --
    return &myPropArray[0];
}
于 2012-12-07T19:54:53.040 回答