iOS:指向数组的指针引用

iOS: pointer reference to an array

我有一个带有搜索的 table 视图,搜索范围按钮有两个可能的范围。在执行搜索之前,table 为空。每个范围都有它自己的 mutable 数组用于 table 的数据源,我们会说 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

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

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

How do I create an array property that just references an array, and always points to the same object in memory even if it changes?

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

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