iOS:指向数组的指针

时间:2015-01-29 05:38:32

标签: ios objective-c automatic-ref-counting

我有一个带有搜索的表格视图,以及带有两个可能范围的搜索范围按钮。在执行搜索之前,该表为空。每个范围都有自己的可变数组用于表格的数据源,我们会说scopeA_arrayscopeB_array。为了简化某些方法,我尝试创建一个通用指针引用,指向当前活动范围中的任何一个数组。所以我尝试了这个:

@property (nonatomic, assign) NSMutableArray *tableDataArray;

在viewDidLoad中,我将其分配给默认的选定范围。

_tableDataArray = _scopeA_array;

我可以记录每个阵列的内存地址,它们都是相同的。

但是,如果我执行搜索,则会填充_scopeA_array。然后在我的numberOfRowsInSection方法中,我计算_tableDataArray,但它是空的。我再次记录地址,两者都不同。

如何创建仅引用数组的数组属性,并始终指向内存中的同一对象,即使它发生了变化?

编辑:使用以下几行代码测试此方法的简化方法是希望tableDataArray具有testArray的内容,即使testArray的内容是在以下时间分配的:

NSArray *testArray = [NSArray new];
NSArray *tableDataArray = [testArray copy];
testArray = [NSArray arrayWithObjects:@"my", @"test", @"array", nil];
NSLog(@"table data array: %@", tableDataArray);
// logs empty array

2 个答案:

答案 0 :(得分:3)

我认为最好的方法是使用一种方法有条件地返回当前范围的数组。所以你总是使用这个方法来填充你的UITableView

- (NSMutableArray*) tableArray
{
    return [self isScopeA] ? _scopeA_array : _scopeB_array;
}

答案 1 :(得分:1)

  

如何创建一个仅引用数组的数组属性,并始终指向内存中的同一对象,即使它发生了变化?

如果要跟踪对变量的更改,则使用指向变量的指针而不是指向单个数组实例的指针。 E.g:

@implementation MyController
{
    __strong NSArray* *_currentDataPtr;
    NSArray* _dataA;
    NSArray* _dataB;
}

- (id)init
{
    if (self = [super init])
    {
        _currentDataPtr = &_dataA; // Ensure _currentDataPtr is never NULL
    }
    return self;
}

- (void)setSearchScope:(NSInteger)searchScope
{
    switch (searchScope)
    {
        default :
            NSAssert(NO, @"");
        case 0 :
            _currentDataPtr = &_dataA;
            break;
        case 1 :
            _currentDataPtr = &_dataB;
            break;
    }
}

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return [*_currentDataPtr count];
}

如果你想让它成为一个属性,那么实现一个取消引用指针的属性getter:

@property (nonatomic, readonly) NSArray* currentData;

- (NSArray*)currentData { return *_currentDataPtr; }