iOS - 在NSMutableArray中随机播放/随机化对象的顺序

时间:2017-02-17 02:46:28

标签: ios objective-c

我想在执行方法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]);
            }];

3 个答案:

答案 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]; 我认为这适合你。