iOS:指向数组的指针引用
iOS: pointer reference to an array
我有一个带有搜索的 table 视图,搜索范围按钮有两个可能的范围。在执行搜索之前,table 为空。每个范围都有它自己的 mutable 数组用于 table 的数据源,我们会说 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
我认为最好的方法是使用一种方法 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; }
我有一个带有搜索的 table 视图,搜索范围按钮有两个可能的范围。在执行搜索之前,table 为空。每个范围都有它自己的 mutable 数组用于 table 的数据源,我们会说 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
我认为最好的方法是使用一种方法 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; }