UITableView reloadData EXC_BAD_ACESS 代码=2

2024-04-01

我有用于加载 UITableView 的代码:

- (int)numberOfSectionsInTableView:(UITableView *)tableView {
    if (tableView == self.peopleTableView)
        return [self.people count];
    else
        return [[[self.scheduleDays objectAtIndex:self.dayInt] periods] count];
}

- (int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == self.peopleTableView)
        return [[self.people objectAtIndex:section] count];
    else
        return 1;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (tableView == self.peopleTableView)
        return [self.headers objectAtIndex:section];
    else
        return [NSString stringWithFormat:@"%@ - %@", [[[[self.scheduleDays objectAtIndex:self.dayInt] periods] objectAtIndex:section] startTime], [[[[self.scheduleDays objectAtIndex:self.dayInt] periods] objectAtIndex:section] endTime]];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return self.headers;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return index;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.peopleTableView) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        if (cell == nil)
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

        Person *person = [[self.people objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
        [[cell textLabel] setText:[NSString stringWithFormat:@"%@ %@", [person firstName], [person lastName]]];

        return cell;
    } else {
        ScheduleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

        if (cell == nil) {
            cell = [[ScheduleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
            [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
        }

        Period *period = [[[[[[self appDelegate] user] scheduleDays] objectAtIndex:self.dayInt] periods] objectAtIndex:[indexPath section]];

        [[cell mainLabel] setText:[period desc]];
        [[cell subtitleLabel1] setText:[period teacher]];
        [[cell subtitleLabel2] setText:[period roomLocation]];

        return cell;
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.peopleTableView) {
        self.currentViewedPerson = [[self.people objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
        [self loadPerson:self.currentViewedPerson];
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.scheduleTable)
        return 70;
    else
        return 44;
}

我使用方法调用[_tableView reloadData]加载数据。第一次工作正常,但第二次就失败了EXC_BAD_ACCESS code=2. Why?

EDIT:

看来错误是来自调用

#0  0x01b8c2a3 in TComponentFont::GetMinSideBearing(CGAffineTransform const&, bool) const ()

或致电

我希望这有帮助。

EDIT:

NSZombies 也没有提供任何帮助。在 Xcode(使用 NSZombies)中运行它,我得到同样的错误,没有输出,使用僵尸配置文件对其进行分析,但没有任何消息,应用程序只是崩溃了。

EDIT:

此错误来自部分标题,因为当我注释掉这些部分时,我不再收到错误。我的章节标题实施有什么不正确的地方?

EDIT:

就是这样_headers在 DirectoryViewController.h 中声明:

@property (strong, nonatomic) NSMutableArray *headers;

如何填充标头(可能并非全部必需,但是......):

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if (parser == self.peopleParser) {
        if ([elementName isEqualToString:@"People"]) {
            self.people = [NSMutableArray array];
            self.headers = [NSMutableArray array];
        } else if ([elementName isEqualToString:@"Person"]) {
            self.currentPerson = [Person new];
            [self.currentPerson setPersonID:[attributeDict objectForKey:@"id"]];
        }
    } else if (parser == self.scheduleParser) {
        if ([elementName isEqualToString:@"Schedule"])
            self.scheduleDays = [NSMutableArray array];
        else if ([elementName isEqualToString:@"Day"]) {
            NSEntityDescription *entity = [NSEntityDescription entityForName:@"ScheduleDay" inManagedObjectContext:[[self appDelegate] managedObjectContext]];
            self.currentDay = [[ScheduleDay alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
        } else if ([elementName isEqualToString:@"Course"]) {
            NSEntityDescription *entity = [NSEntityDescription entityForName:@"Period" inManagedObjectContext:[[self appDelegate] managedObjectContext]];
            self.currentPeriod = [[Period alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
        }
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    self.currentString = string;
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if (parser == self.peopleParser) {
        if ([elementName isEqualToString:@"People"])
            self.currentLetter = @"";
        else if ([elementName isEqualToString:@"Person"]) {
            if ([self.currentLetter isEqualToString:[[[self.currentPerson lastName] substringToIndex:1] uppercaseString]])
                [[self.people lastObject] addObject:self.currentPerson];
            else {
                [self.people addObject:[NSMutableArray array]];
                [self.headers addObject:[[[self.currentPerson lastName] substringToIndex:1] uppercaseString]];
                self.currentLetter = [[[self.currentPerson lastName] substringToIndex:1] uppercaseString];
                [[self.people lastObject] addObject:self.currentPerson];
            }
        } else if ([elementName isEqualToString:@"Last"])
            [self.currentPerson setLastName:self.currentString];
        else if ([elementName isEqualToString:@"First"])
            [self.currentPerson setFirstName:self.currentString];
        else if ([elementName isEqualToString:@"EmailAddress"])
            [self.currentPerson setEmail:self.currentString];
        else if ([elementName isEqualToString:@"PhoneCell"])
            [self.currentPerson setCellPhone:self.currentString];
        else if ([elementName isEqualToString:@"PhoneHome"])
            [self.currentPerson setHomePhone:self.currentString];
        else if ([elementName isEqualToString:@"GradYear"])
            [self.currentPerson setGradYear:self.currentString];
        else if ([elementName isEqualToString:@"StudentGrade"])
            [self.currentPerson setGrade:self.currentString];
        else if ([elementName isEqualToString:@"Street1"])
            [self.currentPerson setStreet1:self.currentString];
        else if ([elementName isEqualToString:@"Street2"])
            [self.currentPerson setStreet2:self.currentString];
        else if ([elementName isEqualToString:@"City"])
            [self.currentPerson setCity:self.currentString];
        else if ([elementName isEqualToString:@"State"])
            [self.currentPerson setState:self.currentString];
        else if ([elementName isEqualToString:@"Zip"])
            [self.currentPerson setZip:self.currentString];
    } else if (parser == self.scheduleParser) {
        if ([elementName isEqualToString:@"Course"])
            [self.currentPeriod setDay:self.currentDay];
        else if ([elementName isEqualToString:@"Day"])
            [self.scheduleDays addObject:self.currentDay];
        else if ([elementName isEqualToString:@"StartTime"])
            [self.currentPeriod setStartTime:self.currentString];
        else if ([elementName isEqualToString:@"EndTime"])
            [self.currentPeriod setEndTime:self.currentString];
        else if ([elementName isEqualToString:@"Description"])
            [self.currentPeriod setDesc:self.currentString];
        else if ([elementName isEqualToString:@"Location"])
            [self.currentPeriod setRoomLocation:self.currentString];
        else if ([elementName isEqualToString:@"Teacher"])
            [self.currentPeriod setTeacher:self.currentString];
    }
    self.currentString = @"";
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    if ([parseError code] == 5) {
        self.people = [NSMutableArray array];
        self.headers = [NSMutableArray array];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!" message:[parseError description] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
}

EDIT:

哪里的reloadData叫做:

- (void)search {
    NSString *urlString = [LINK SETUP CODE GOES HERE]

    self.peopleParser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:urlString]];
    self.peopleParser.delegate = self;
    if ([self.peopleParser parse] && [self.people count] > 0) {
        [self.peopleTableView reloadData];
        [self.peopleTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
        [self.view addSubview:self.peopleView];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Results!" message:@"Your search returned no results. Try broadening your search." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
    [self.activityIndicator stopAnimating];
    self.activityIndicator.hidden = YES;
}

为了避免内存问题,您应该创建对象并使用属性访问器方法引用对象。

例如,您申报财产headers可变数组:

@property (strong, nonatomic) NSMutableArray *headers;

然后你应该这样创建你的数组:

 self.headers = [NSMutableArray array];

并以这种方式引用您的数组:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self.headers objectAtIndex:section];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return self.headers;
}

使用此语法,您可以调用 setter 和 getter 方法headers属性(这些方法由 Xcode 自动生成)。

在非ARC环境中,相当于调用这些方法(retain, nonatomic)财产 (retain是类似的strong):

- (NSMutableArray *)headers {

  return _headers;
 }

- (void)setHeaders:(NSMutableArray *)headers {

    [_headers autorelease];
    _headers = [headers retain];
}

如果你使用self.ARC 环境中的符号跟踪对象的引用计数将自动完成。

您可以找到有关属性的更多信息here https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html.

EDIT:

这似乎是框架中的一个错误。检查这个answer https://stackoverflow.com/a/19010375/1158590

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UITableView reloadData EXC_BAD_ACESS 代码=2 的相关文章

  • 无法构建 Saurik 的 ldid 实用程序

    当我执行此命令 make sh 时 我遇到这些错误 构建用于越狱调整开发的 ldid 实用程序 Bilals Mac ldid billy make sh g arch i386 arch x86 64 arch ppc arch armv
  • 如何使用 iPhone SDK 实现可滑动的图像堆栈(例如照片应用程序)?

    我想获取一堆图像 或者可能是一组用于下载图像的 URL 并以全屏方式显示它们 一次一个 使用 iPhone SDK 使用用户滑动来平滑地为堆栈中的下一个图像设置动画 Apple 的 Photo app 似乎可以做到这一点 此外 如果尚未检索
  • 是否有适用于 iPad 2 的条码扫描仪 SDK? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ios 用户如何取消 Facebook 登录?

    当用户到达此屏幕时 无法取消 我能做些什么 为了首先获得这个视图 我正在运行 NSMutableDictionary params NSMutableDictionary dictionaryWithObjectsAndKeys vid l
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 打乱 NSMutableArray 而不重复并显示在 UIButton 中

    在我看来 我有 12 个按钮 一个数组包含 6 个名称 我想在其中打印数组名称UIButton标题 这是我的代码 texts NSMutableArray alloc initWithObjects 1 2 3 4 5 6 nil UIBu
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • 使用 iPhone 中的地图视图读取当前位置名称

    我读取了当前位置的纬度和经度值 然后成功将该位置固定在 iPhone 中 现在我想使用这个纬度和经度值读取该地名 我使用以下代码来读取查找当前位置 void mapView MKMapView mapView1 didUpdateUserL
  • 如何在 Firebase 控制台中使用 Apple 新的 APN .p8 证书

    随着最近 Apple 开发者帐户的升级 我面临着一个困难 在尝试创建推送通知证书时 它为我提供了 p8 证书 而不是可以导出到 p12 的 APNs 证书 Firebase 控制台仅接受 p12 证书 那么我如何从这些新的 p8 证书中获取
  • 模块未使用库演化支持进行编译;使用它意味着无法保证二进制兼容性

    最近我遇到了 SDK 的编译时警告 这是否意味着它不是使用目标设置 构建用于分发的库 构建的 你需要设置Build Libraries for Distribution在项目中Build Settings to No然后它就会消失
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • UIPanGestureRecognizer 对坐标的限制

    我在主 UIView 中添加了一个子视图 称为panel 并且我向其中添加了gestureRecognizer 因为我希望它只能在Y轴上拖动并且只能在某些限制下 即160 300 超过300它不能拖动 我以这种方式实现了手势处理 IBAct
  • AVAssetExportSession 为零 iPhone 7 - Plus 模拟器

    AVAssetExportSession在 iPhone 6 及以下版本上运行良好 但在 iPhone 7 iPhone 7 Plus 模拟器上运行不佳 Xcode 8 0 这段代码return nil在exportSession中 当在i
  • 根据 iOS 版本使用不同的类实现?

    iOS 11 最近添加了一个我想使用的新功能 但我仍然需要支持旧版本的 iOS 有没有一种方法可以将同一个类编写两次 并让较新版本的 iOS 使用该类的一个版本 而旧版本的 iOS 使用另一个版本 注 最初我用的是if available
  • 如何将 ios7 通用应用程序升级到基于 Xcode 6 的通用故事板应用程序?

    我目前有一个基于 xcode 5 ios 7 的通用应用程序 因此有两个故事板 我正在考虑将其更新到 ios 8 有没有办法 最佳方法将两个故事板迁移到通用的单个故事板 我在 xcode 6 中看不到转换选项 None
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • 如何阻止 UITableView moveRowAt IndexPath 在重新排序时留下空白行

    我遇到一个问题 在重新排序 UITableViewCells 时 tableView 不随单元格滚动 仅出现一个空白行 任何后续滚动都会出现数组越界错误 堆栈跟踪中没有我的任何代码 这是该问题的快速视频 http www screencas

随机推荐

  • 如何使用 Xcode 服务器导出临时存档

    我正在使用 Xcode 服务器 Xcode 9 beta 6 并定义了一个机器人来使用我的临时配置文件归档和导出临时构建 我已关闭项目中的自动签名 并在 bot Arguments 窗口中为 xcodebuild 定义了参数 包括 DEVE
  • 使用 Axis2 创建 Web 服务的步骤 - 客户端代码

    我正在尝试创建一个网络服务 我的交易工具是 Axis2 Eclipse Tomcat Ant 我需要从代码创建一个 Web 服务 即编写一个基本的 java 类 该类将具有要在 WSDL 中声明的方法 然后使用 java2WSDL sh 创
  • 代表移动通信系统中使用的蜂窝网络的六边形网格

    我对 Matlab 比较陌生 我想生成一个六边形网格来表示一个蜂窝网络 其中每个六边形都有特定的行为 我的问题是如何从方形网格变为六角形网格 传输矩阵 这是我到目前为止所拥有的 X Y meshgrid 0 60 figure 1 plot
  • 如何修改 DateFormatSymbols 月份值

    我正在尝试为特定区域设置添加特定月份名称 我遇到的问题是挪威语 bokmal 的语言环境 注意 SimpleDateFormat 返回的月份名称是英语而不是挪威语 然而 区域设置 否 似乎工作正常 例如此代码结果为一月 二月等 String
  • 在 javax.xml.bind 中使集合通用

    在我编写的 REST 服务器中 我有几个集合类 它们包装要从我的服务返回的单个项目 XmlAccessorType XmlAccessType NONE XmlRootElement name person collection publi
  • 一个或多个无效的包名称。确保包名称与有效的 Google Play 商店 URL 关联

    I m having trouble configuring Facebook login for Kotlin App according to website address https developers facebook com
  • Django ORM 中的自定义 TruncFunc

    我有一个具有以下结构的 Django 模型 class BBPerformance models Model marketcap change models FloatField verbose name marketcap change
  • 为什么我必须匹配参数名称才能从 MVC4 Web 应用程序中的 ajax 调用获取 json 数据?

    我只是想知道为什么 NET需要将参数名称与JSON对象的键名称相匹配 此处快速代码预览 var json service COMMON method MENU SUBLIST UID 1000007 ULID stackoverflow U
  • 未知文件类型:basic archive.of(boost 和 emscripten)

    我正在尝试在浏览器内反序列化文件 使用 boost serialization 我用 emscripten 编译 boost 显然没有问题 当编译 实际上是链接 我的程序时 我收到错误 wasm ld error unknown file
  • 如何缩放 iframe 的内容?

    如何在我的网站页面中缩放 iframe 的内容 在我的示例中 它是 HTML 页面 而不是弹出窗口 例如 我想以原始大小的 80 显示 iframe 中出现的内容 基普的解决方案 https stackoverflow com questi
  • .htaccess 维护多个IP

    我在 htaccess 文件中使用以下代码将我的网站置于维护状态 本质上 它的作用是将非特定 IP 地址的任何人重定向到 maintenance 我有一个维护页面的子域 因此允许我在真实站点上执行测试 我的问题是 如何向该行添加第二个 IP
  • C# 只读二维数组

    在 C 中是否有返回只读二维数组的既定方法 I know ReadOnlyCollection是用于一维数组的正确选择 并且我很高兴编写我自己的包装类来实现this get 但如果这个轮子已经存在 我不想重新发明轮子 不幸的是 没有任何内置
  • Python 日志记录仅从脚本记录

    我正在我的一个简单脚本中使用 Python 日志记录模块 目前进行了以下设置 logging basicConfig format asctime s message s level logging INFO datefmt Y m d H
  • 如何打开机器人电子日志记录

    我需要一种非常简单的方法来让 Robolectric 3 0 打开日志记录 我想看到 robolectric 的输出 而不仅仅是我的测试 我在网上尝试的一切都不起作用 我把这个贴在哪里 robolectric logging enabled
  • 我如何自定义所有 UITextField 的 borderWidth 外观?

    我正在尝试自定义 borderWith 的所有 UITextField 外观 尝试这样的事情 只有前两行有影响 其余线路无法正常工作 UITextField appearance setBackgroundColor UIColor gre
  • 是否可以在

    这个问题在这里已经有答案了 我怎样才能添加 div or a span 标签内的 span div
  • Node-sass 未与 Node / Express 一起编译

    我试图让 node sass 与express一起工作 但我根本无法让它进行任何编译 这是我的 app js 文件 var express require express sass require node sass routes requ
  • 策略模式或函数指针[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在 C 中 当我有可以在运行时接受不同行为的算法时 我宁愿使用函数指针 例如 用于绘制图表的程序有一种绘制线条的算法 该算法可以接受任何函数
  • 同步jquery $.ajax而不锁定IE?

    花了一些时间尝试实现这一点 并找到了一个我认为在 Firefox 中效果很好的解决方案 但是在 IE 中测试时发现使用 async false 会导致浏览器被锁定 停止响应并似乎已冻结 通话时长 要求基本如下 我提供了一系列用户可以检查的复
  • UITableView reloadData EXC_BAD_ACESS 代码=2

    我有用于加载 UITableView 的代码 int numberOfSectionsInTableView UITableView tableView if tableView self peopleTableView return se