0

我想創建一個包含指向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我釋放所有的內存:

​​

回答

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

你不能因爲你不能聲明一個Objective-C類的具體對象。所以

NumberStringsArray object; 

不允許的。

你被迫將其聲明爲

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

所以你必須通過正確的->操作員訪問伊娃應用於指針。請注意,Objective-C中的object.something只是[object something]的簡寫,而在標準C中,您將使用.訪問具體的struct的字段。

+0

他具有三指針,所以_array [i] [j]不會是一個具體的類,而是一個指針,並且是允許的。 –

+0

@RamyAlZuhouri那麼你將如何聲明與_array相對應的屬性? –

+0

該屬性只是@property(非原子,讀寫)NSString * __unsafe_unretained ** _array;問題在於如何保留字符串。 –

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]; 
}