我想在执行方法reloadData时随机化/随机化我的NSMutableArray中的项目的顺序。我尝试了下面的内容,但是控制台一直在向我抛出以下错误:
由于未捕获的异常而终止应用 ' NSInvalidArgumentException',原因:' - [__ NSArrayI exchangeObjectAtIndex:withObjectAtIndex:]:发送无法识别的选择器 例如0x1748b2c60'
知道为什么会这样吗?我很难过。
的 ViewController.h
@property (strong, retain) NSMutableArray *neighbourData;
ViewController.m
- (void)reloadData:(id)sender
{
NSMutableDictionary *viewParams = [NSMutableDictionary new];
[viewParams setValue:@"u000" forKey:@"view_name"];
[DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {
self.neighbourData = (NSMutableArray *)responseObject;
[self.tableView reloadData];
NSUInteger count = [self.neighbourData count];
for (NSUInteger i = 0; i < count; ++i) {
// Select a random element between i and end of array to swap with.
int nElements = count - i;
int n = (arc4random() % nElements) + i;
[self.neighbourData exchangeObjectAtIndex:i withObjectAtIndex:n];
}
NSLog(@"This is the neighbourdata %@",self.neighbourData);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", [error localizedDescription]);
}];
答案 0 :(得分:2)
错误表明responseObject
实际上是不可变的NSArray
。您应用的强制转换只是编译器,但它实际上并没有在运行时更改任何内容。
变化:
self.neighbourData = (NSMutableArray *)responseObject;
为:
self.neighbourData = [(NSArray *)responseObject mutableCopy];
答案 1 :(得分:0)
对于制作,你真的应该使用内置的Fisher-Yates shuffle in Gamekit。如果你这样做是为了倾斜目的,那么问题在于:
int n = (arc4random() % nElements) + i;
您正在从第一个元素创建一个随机数,然后将i添加到其中。显然,这意味着您的索引现在可以超出范围。摆脱 + i 。
答案 2 :(得分:0)
self.neighbourData = (NSMutableArray *)responseObject;
您必须确保您的responseObject是NSMutableArray的实例。即使您将类型responseObject强制转换为NSMutableArray,如果它不是NSMutableArray的实例,它也会崩溃,因为它不具有exchangeObjectAtIndex:withObjectAtIndex:。在这种情况下,您的responseObject是一个NSArray实例,您可以将代码更改为:
NSArray *tmp = (NSArray *)responseObject;
self.neighbourData = [tmp mutableCopy];
我认为这适合你。