我想創建一個包含指向NSStrings的動態二維c數組的指針的類。我知道我可以使用包含多個NSArrays的NSArray來模擬二維數組,但如果可能的話,我想使用傳統的二維C數組來做到這一點。 ARC不會允許一個指向一個NSString的簡單分配到C-數組的元素,除非你使用「__unsafe_unretained」:ivar的屬性指向指向NSStrings的二維數組
@interface NumberStringsArray : NSObject
{
@public
NSString * __unsafe_unretained **_array;
}
以避免內存泄漏和的階級所有制給予對象每個NSString分配給c數組,我將一個指向每個NSString對象的指針添加到一個NSMutableArray。在 - (void)dealloc中,我釋放獲取的內存以創建二維c數組。
這是我的問題:如何聲明基於_array伊娃的屬性,以便我可以將數組的i,j元素稱爲「foobar.array [i] [j]」而不是「foobar- >陣列[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;
}
在 - (無效) dealloc我釋放所有的內存:
他具有三指針,所以_array [i] [j]不會是一個具體的類,而是一個指針,並且是允許的。 –
@RamyAlZuhouri那麼你將如何聲明與_array相對應的屬性? –
該屬性只是@property(非原子,讀寫)NSString * __unsafe_unretained ** _array;問題在於如何保留字符串。 –