我有一个带有搜索的表格视图,以及带有两个可能范围的搜索范围按钮。在执行搜索之前,该表为空。每个范围都有自己的可变数组用于表格的数据源,我们会说scopeA_array
和scopeB_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
答案 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; }