iOS:指向数组的指针引用

iOS:指向数组的指针引用,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,我有一个带有搜索的表视图,以及带有两个可能范围的搜索范围按钮。在执行搜索之前,该表为空。对于表的数据源,每个作用域都有自己的可变数组,我们称之为scopeA\u数组和scopeB\u数组。为了简化一些方法,我尝试创建一个通用指针引用,指向当前活动范围内的任何数组。所以我试了一下: @property (nonatomic, assign) NSMutableArray *tableDataArray; 在viewDidLoad中,我将其指定给默认的选定范围 _tableDataArray =

我有一个带有搜索的表视图,以及带有两个可能范围的搜索范围按钮。在执行搜索之前,该表为空。对于表的数据源,每个作用域都有自己的可变数组,我们称之为
scopeA\u数组
scopeB\u数组
。为了简化一些方法,我尝试创建一个通用指针引用,指向当前活动范围内的任何数组。所以我试了一下:

@property (nonatomic, assign) NSMutableArray *tableDataArray;
在viewDidLoad中,我将其指定给默认的选定范围

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

但是,如果执行搜索,
\u scopeA\u array
将被填充。然后在我的
numberOfRowsInSection
方法中,我对
\u 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

我认为最好的方法是使用一个方法有条件地返回当前作用域的数组。所以您总是使用此方法来填充UITableView

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

我认为最好的方法是使用一个方法有条件地返回当前作用域的数组。所以您总是使用此方法来填充UITableView

- (NSMutableArray*) tableArray
{
    return [self isScopeA] ? _scopeA_array : _scopeB_array;
}
如何创建一个数组属性,该属性只引用一个数组,即使它发生了变化,也始终指向内存中的同一个对象

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

@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; }
如何创建一个数组属性,该属性只引用一个数组,即使它发生了变化,也始终指向内存中的同一个对象

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

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


您没有增加_scopeA_数组的保留计数。。。它在你的numberOfRowsInSection调用之前被释放了吗?我不知道,我该怎么做?你如何填充_scopeA_数组?嗯,我想这是你的问题。要保留对_scopeA_数组的相同引用,您应该改用
[\u scopeA_数组addObjectsFromArray:request_result]
,asuming
request_result
是一个数组,将属性更改为(非原子,强)。您没有增加_scopeA_数组的保留计数。。。它在你的numberOfRowsInSection调用之前被释放了吗?我不知道,我该怎么做?你如何填充_scopeA_数组?嗯,我想这是你的问题。为了保持对_scopeA_数组的相同引用,您应该改为使用
[\u scopeA_数组addObjectsFromArray:request_result]
,asuming
request_result
是一个数组,将属性更改为(非原子,强)。这就是我现在要做的,但重点(和问题)是使用指针引用,如果有可能的话,我不明白你为什么要这么做而不是这个。但无论如何,您应该像这样分配self.tableDataArray=\u scopeA\u array;当您更改作用域时,这将不起作用,因为在进行搜索后,在更改作用域后会填充数组。我认为这将起作用,因为一旦您访问self.tableDataArray,此数组指向_scopeA_数组,因此对_scopeA_数组所做的更改可通过self获得。TableDataArray我以前误解了答案,您是对的。这是最好的方法。这就是我现在正在做的,但问题的关键(和问题)是使用指针引用,如果可能的话。我不明白你为什么要这样做而不是这样做。但无论如何,您应该像这样分配self.tableDataArray=\u scopeA\u array;当您更改作用域时,这将不起作用,因为在进行搜索后,在更改作用域后会填充数组。我认为这将起作用,因为一旦您访问self.tableDataArray,此数组指向_scopeA_数组,因此对_scopeA_数组所做的更改可通过self获得。TableDataArray我以前误解了答案,您是对的。这是最好的方法。试图实现这一点,但xcode不喜欢
NSArray**\u currentDataPtr,并抱怨“指向非常量类型‘NSArray*’的指针,没有明确的所有权。”这是打字错误吗?@inorganik在这种情况下,您似乎必须明确声明所有权。默认情况下,局部变量和实例变量是
\u strong
。我已经编辑了我的答案。试图实现这一点,但xcode不喜欢
NSArray**\u currentDataPtr,并抱怨“指向非常量类型‘NSArray*’的指针,没有明确的所有权。”这是打字错误吗?@inorganik在这种情况下,您似乎必须明确声明所有权。默认情况下,局部变量和实例变量是
\u strong
。我已经编辑了我的答案。