ivar的属性,该属性指向指向指向NSString的指针的二维数组



我想创建一个包含指向NSString的指针的动态二维c数组的类。我知道我可以使用包含多个NSArray的NSArray来模拟二维数组,但如果可能的话,我想使用传统的二维c数组。ARC不允许将指向NSString的指针简单地分配给c数组的元素,除非您使用"__unsaf_unrained":

@interface NumberStringsArray : NSObject
{
@public
NSString * __unsafe_unretained **_array;
}

为了避免内存泄漏,并使类中的对象拥有分配给c数组的每个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
{
for (UINT16 i = 0; i < self.columnCount; i++)
if (self->_array[i])
free(self->_array[i]);
if (self->_array)
free(self->_array);
}

声明此属性:

@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);

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

NumberStringsArray object;

不允许。

您被迫将其声明为

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

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

(注意:这涉及到创建/使用属性来访问数据,而不是传统的Objective-C存储管理或ARC管理数据的方式。一想到这一点,我就头疼。)

如果您希望只读C数组"看起来"像Objective-C属性,请声明该属性(如@property (readonly, nonatomic) char* myProp;),然后按照以下行为其实现getter,而不是使用@synthesize

-(char**)myProp {
return myPropPointer;
// Or, if the array is allocated as a part of the instance --
return &myPropArray[0];
}

最新更新