【问题标题】:Issue Paging with UITableView使用 UITableView 发出分页
【发布时间】:2014-01-06 01:54:53
【问题描述】:

我正在尝试使用 UITableView 和 AFNetworking 在 Instagram 创建一个无限滚动类型的东西,但是当我到达视图底部时出现此错误:

CRASH :
 -[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object
2014-01-05 20:51:41.627 Floadt[1579:70b] STACK TRACE :
 (
    0   CoreFoundation                      0x02b775e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x027a38b6 objc_exception_throw + 44
    2   CoreFoundation                      0x02b773bb +[NSException raise:format:] + 139
    3   CoreFoundation                      0x02bfe365 -[__NSCFArray insertObject:atIndex:] + 101
    4   CoreFoundation                      0x02b3b2d0 -[NSMutableArray insertObjects:count:atIndex:] + 208
    5   CoreFoundation                      0x02b3af69 -[NSMutableArray insertObjectsFromArray:range:atIndex:] + 425
    6   CoreFoundation                      0x02b3ad15 -[NSMutableArray addObjectsFromArray:] + 661
    7   Floadt                              0x0003f5ec __42-[StreamViewController nextInstagramPage:]_block_invoke + 284
    8   Floadt                              0x0001edfb __64-[AFJSONRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke91 + 43
    9   libdispatch.dylib                   0x035247f8 _dispatch_call_block_and_release + 15
    10  libdispatch.dylib                   0x035394b0 _dispatch_client_callout + 14
    11  libdispatch.dylib                   0x0352775e _dispatch_main_queue_callback_4CF + 340
    12  CoreFoundation                      0x02bdca5e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14
    13  CoreFoundation                      0x02b1d6bb __CFRunLoopRun + 1963
    14  CoreFoundation                      0x02b1cac3 CFRunLoopRunSpecific + 467
    15  CoreFoundation                      0x02b1c8db CFRunLoopRunInMode + 123
    16  GraphicsServices                    0x0453c9e2 GSEventRunModal + 192
    17  GraphicsServices                    0x0453c809 GSEventRun + 104
    18  UIKit                               0x01936d3b UIApplicationMain + 1225
    19  Floadt                              0x0006646d main + 141
    20  libdyld.dylib                       0x037cb70d start + 1
    21  ???                                 0x00000001 0x0 + 1
)

这是我编写代码的方式,让我感到困惑的是我所有的数组都是可变的,但它声明变异方法被发送到不可变对象:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y == roundf(scrollView.contentSize.height-scrollView.frame.size.height)) {
        NSDictionary *page = instagramResponse[@"pagination"];
        NSString *nextPage = page[@"next_url"];

        [[InstagramClient sharedClient] getPath:[NSString stringWithFormat:@"%@",nextPage] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

            instagramResponse = [responseObject mutableCopy];
            [instagramResponse addEntriesFromDictionary:responseObject];
            [instaPics addObjectsFromArray:responseObject[@"data"]];
            [self.tableView reloadData];

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Failure: %@", error);
        }];
    }
}

【问题讨论】:

  • 堆栈跟踪不会说谎。在[StreamViewController nextInstagramPage:] 内的块方法中查找addObjectsFromArray: 调用。找到数组的名称后,查找可能设置为不可变对象的位置。

标签: ios iphone objective-c uitableview uiscrollview


【解决方案1】:

addEntriesFromDictionary之前的字典像这样

NSDictionary *copyOfDic = [[NSDictionary alloc] initWithDictionary: originalDic copyItems: YES];
if (copyOfDic ) {
    [destination addEntriesFromDictionary: copyOfDic ];
    [copyOfDic release];
}

[instaPics addObjectsFromArray:[responseObject[@"data"]mutable copy]];

您的 @property yourarray 要么使用 NSArray 进行初始化,要么声明为副本。

因为两者都会导致此错误/异常消息,因为支持 ivar 将指向(不可变的)NSArray。

如果您已将属性声明为 NSMutableArray 类型,请使用 strong 作为存储修饰符而不是 copy。

【讨论】:

  • 我尝试按照您所说的进行操作,但遇到了同样的错误。 NSMutableArray 已经很强大了。
  • 您在使用 NSZombie 时会遇到异常。告诉我
  • 错误出现在[instaPics addObjectsFromArray:responseObject[@"data"]]; 行我已经编辑了我试图在应用程序中分页的方式
  • [instaPics addObjectsFromArray:[responseObject[@"data"]mutable copy]];你试过了吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2018-05-02
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多