为啥我的 for 循环会错过它操作的 NSMutableArray 中的第一个元素?
Posted
技术标签:
【中文标题】为啥我的 for 循环会错过它操作的 NSMutableArray 中的第一个元素?【英文标题】:why does my for loop miss the first element in the NSMutableArray on which it operates?为什么我的 for 循环会错过它操作的 NSMutableArray 中的第一个元素? 【发布时间】:2013-06-14 19:00:49 【问题描述】:我正在尝试遍历我的 iPod 库中歌曲的持久 ID 的 NSMutableArray,使用每个 ID 执行 MPMediaQuery,并从查询返回的 MPMediaItems 的 NSMutableArray 初始化 MPMediaItemCollection。这是我的代码:
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
NSLog(@"songArray viewDidLoad: %@", self.songArray);
for (int i=0; i<[self.songArray count]; i++)
NSString *pID = [NSString stringWithFormat:@"%@", [self.songArray objectAtIndex:i]];
MPMediaQuery *cellQuery = [[MPMediaQuery alloc] init];
[cellQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:pID
forProperty:MPMediaItemPropertyPersistentID]];
[pID release];
for (MPMediaItem *item in [cellQuery items])
[tempArray addObject:item];
[cellQuery release];
NSLog(@"tempArray: %@", tempArray);
self.detailCollection = [[MPMediaItemCollection alloc] initWithItems:tempArray];
NSLog(@"self.detailCollection: %@", self.detailCollection);
其中 self.songArray 是包含持久 ID 的 NSMutableArray。 代码有效,只是它错过了 self.songArray 中的第一个元素。 这是我的一些控制台输出,显示 self.songArray 在 for 循环开始之前包含 3 个项目,并且只有 1 个 ID(最后一个一)被添加到 NSMutableArray 中:
2013-06-14 14:55:17.472 green[5579:907] songArray viewDidLoad: (
14834145442532377094,
13706522831184680273,
1223941966377655149
)
2013-06-14 14:55:17.498 green[5579:907] tempArray: (
)
2013-06-14 14:55:17.501 green[5579:907] tempArray: (
)
2013-06-14 14:55:17.505 green[5579:907] tempArray: (
"<MPConcreteMediaItem: 0x1146e5a0> 1223941966377655149"
)
2013-06-14 14:55:17.506 green[5579:907] self.detailCollection: <MPMediaItemCollection: 0x11feb140>
编辑:删除了[pID release];,现在for循环只漏掉了数组中的第一个元素。
【问题讨论】:
检查您的查询是否确实找到任何项目(在[tempArray addObject:item];
行中设置日志或断点)。
我确实添加了一个 NSLog,它显示 [cellQuery items] 除了最后一个元素之外的所有元素都是空的
【参考方案1】:
代码中唯一错误的是以下语句:
[pID release];
你没有分配它,所以你不需要销毁它。休息一切看起来都很好。
还需要进行更多更改。在下面的行中,您将 pId 作为字符串传递。您应该将其作为数字传递。
NSNumber *pID = [NSNumber numberWithLongLong:[[self.songArray objectAtIndex:i] longLongValue]];
[cellQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:pID
forProperty:MPMediaItemPropertyPersistentID]];
【讨论】:
有趣的是,删除 [pID release];导致 for 循环获取除 first 之外的所有元素。 知道为什么它会错过第一个元素吗?我是否应该开始一个新问题,因为它似乎是一个新的、不相关的问题? 谢谢 Apurv,我一定是在您发帖时发现了号码问题。我设法让它工作: unsigned long long ullvalue = strtoull([pID UTF8String], NULL, 0); NSNumber *UniqueID = [NSNumber numberWithUnsignedLongLong:ullvalue];我使用 UniqueID 作为谓词值。我会将您的答案标记为正确。 @user2136500 太棒了。享受编码..!!以上是关于为啥我的 for 循环会错过它操作的 NSMutableArray 中的第一个元素?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 MPI_SEND 在我的 for 循环中不起作用?如果明确说明它工作正常