Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带有Objective-C的双指针。更改指针指向的位置。_Ios_Objective C_Pointers - Fatal编程技术网

Ios 带有Objective-C的双指针。更改指针指向的位置。

Ios 带有Objective-C的双指针。更改指针指向的位置。,ios,objective-c,pointers,Ios,Objective C,Pointers,我有一个UITableView,其中有两个数据源 @property(strong)NSArray* mediaItems; @property(strong)NSArray* likesItems; 在很多情况下,我需要交换两个源。因此,在我检查的地方有很多if语句 if (self.activePage == kDrawingsPage) self.mediaItems = responseObject; else self.likesItems = responseObject; 我想

我有一个UITableView,其中有两个数据源

@property(strong)NSArray* mediaItems;
@property(strong)NSArray* likesItems;
在很多情况下,我需要交换两个源。因此,在我检查的地方有很多if语句

if (self.activePage == kDrawingsPage) self.mediaItems = responseObject;
else self.likesItems = responseObject;
我想做的是不需要像这样一直检查。使用双指针。我不能用双指针来做类似的事情。这行不通

NSArray** activeItems = &self.mediaItems;
然后在我需要访问数据的地方,我可以简单地

- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section {
 NSArray* arr = *self.activeItems;
 return [arr count];
 }
而不是

- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section {
if (self.activePage == kDrawingsPage) [self.mediaItems count];
else [self.likesItems count];
 }

在这种情况下,双指针或类似的东西不应该起作用吗?如果它不能工作,我还有什么其他方法可以最小化这些If语句

您可以使用计算属性

在@interface中

在@implementation中

所以你可以

- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section {
     return [self.activeItems count];
}
&self.mediatems不会为您提供任何有意义的值,因为它与&[self mediatems]相同,后者为您提供返回的临时对象的地址


它应该是&_mediateItems,即基础ivar的地址。

一般来说,这会起作用,但值得注意的是,此代码可能会导致崩溃。像这样的派生数据源属性的问题是,当集合视图在数据源调用之间重新加载时,它可能会发生更改,这可能会导致许多异常,最常见的是试图访问不存在的数组索引的超出范围的异常。理想情况下,会有一个实际的备份ivar,在触发视图重新加载的同时进行修改。@Dima Yes。更好的解决办法是将它们分开。一个视图/视图控制器应该只负责一个页面。Dima说数据源可能会在您不知道的情况下更改是正确的。如果希望它们位于同一视图控制器中,我将创建一个新的NSArray属性,用作集合视图的数据源,然后在设置activePage自定义setter或kvo时,使用mediaItems或LikeItems设置NSArray属性
- (NSArray *)activeItems {
    return self.activePage == kDrawingsPage ? self.mediaItems : self.likesItems
}
- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section {
     return [self.activeItems count];
}