为啥我经常在这段代码中得到 ExcBadAccess:
Posted
技术标签:
【中文标题】为啥我经常在这段代码中得到 ExcBadAccess:【英文标题】:Why I often got ExcBadAccess in this code:为什么我经常在这段代码中得到 ExcBadAccess: 【发布时间】:2014-03-24 05:56:23 【问题描述】:我使用 ARC
NSAttributedString * arString = [self asSchedule:arTimes];
self.lblTimeLeft.attributedText = arString;
没有提供太多信息。它直接进入主目录
int main(int argc, char *argv[])
@autoreleasepool
//int retVal = UIApplicationMain(argc, argv, nil, nil);
int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([newIsiKotaAppDelegate class]));
return retVal;
我设法发现最后执行的代码是这样的: self.lblTimeLeft.attributedText = arString;
我提供了额外的代码来测试一下
NSAttributedString * arString = [self asSchedule:arTimes];
self.lblTimeLeft.attributedText = arString;
PO1(@"Hello World");
while(false);// Error happen after this code is executed
代码是提供 UITableViewCell 显示的例程的一部分。所以错误发生在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSUInteger row = indexPath.row;
NSDictionary * rowDictionary = _marManagedObjectArray [row];
BGCinemaScheduleCell * BCS = [[BGCinemaScheduleCell alloc]init];
BCS.dicCinemaDictionary =rowDictionary;
return BCS; //This is where the error happen
似乎 NSAttributedString 工作正常,直到它实际显示或其他东西。
错误似乎发生在
TAttributes::TAttributes(__CFDictionary const *)
asSchedule的内容很平常
-(NSAttributedString *) asSchedule:(NSArray *) arTimes
NSMutableArray * timeBefore = [NSMutableArray array];
NSMutableArray * timeAfter = [NSMutableArray array];
for (NSString * strTime in arTimes)
NSDate * date = [NSDate dtWithCurrentDateAndProvidedTime: strTime];
NSTimeInterval dblInterval =[date timeIntervalSinceNow];
if (dblInterval>0)
[timeAfter addObject:strTime];
else
[timeBefore addObject:strTime];
NSString * strTimeBefore = [timeBefore componentsJoinedByString:@" "];
NSString * strTimeAfter = [timeAfter componentsJoinedByString:@" "];
NSString *yourString = [NSString stringWithFormat:@"%@ %@", strTimeBefore, strTimeAfter];
// start at the end of strTimeBefore and go the length of strTimeAfter
NSRange boldedRange = NSMakeRange([strTimeBefore length] + 1, [strTimeAfter length]);
NSString *boldFontName = [[UIFont boldSystemFontOfSize:12] fontName];
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:yourString];
[attrString addAttribute:NSFontAttributeName value:boldFontName range:boldedRange];
PO1(NSStringFromRange(boldedRange));
PO1(@(attrString.length));
return attrString;
更新:
我改变了 self.lblTimeLeft.attributedText = arString;到 self.lblTimeLeft.attributedText = arString.copy;无济于事。
我想知道这是否是问题所在: [attrString addAttribute:NSFontAttributeName value:boldFontName range:boldedRange];
我认为原始示例使用 KCFont 代替 NSFontAttributeName
【问题讨论】:
什么是[self asSchedule:arTimes]?? 【参考方案1】:你快到了:
我想知道这是否可能是问题:[attrString addAttribute:NSFontAttributeName value:boldFontName range:boldedRange];
你的代码说:
NSString *boldFontName = [[UIFont boldSystemFontOfSize:12] fontName];
...
[attrString addAttribute:NSFontAttributeName value:boldFontName range:boldedRange];
应该说:
UIFont *boldFont = [UIFont boldSystemFontOfSize:12];
...
[attrString addAttribute:NSFontAttributeName value:boldFont range:boldedRange];
根据文档的表 1(下面的链接)和我自己的应用程序代码,您应该传递 NSFont 而不是字体名称。
https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/AttributedStrings/Articles/standardAttributes.html#//apple_ref/doc/uid/TP40004903-SW2
【讨论】:
是的,我认为这就是问题所在。有人在示例中使用了 kcFont 的东西并传递了字体名称。因为我不知道 kcFont 是干什么用的,所以我把它改成了 NSFontAttributeName。【参考方案2】:无法从代码中判断您的项目是否使用 ARC,但看起来您的 asSchedule 方法返回了一个引用计数为 0 的字符串。您可以保留对该字符串的引用,无论是老式的使用 retain 关键字(可能是个坏主意)或将其分配给使用 strong 关键字(或 retain,如果预先弧)。
调试这些东西的最佳工具是 Instruments,使用 Zombies 检查。如果我是正确的,您在其引用计数达到 0 并且内存已被释放后尝试使用该字符串,您将非常清楚地看到引用计数递增和递减的历史。
【讨论】:
我正在使用 ARC。所以这几乎是不可能的。但返回的是 NSMutableAttributedString。【参考方案3】:尝试分配并初始化Attributedstring
,然后将其分配给self.lblTimeLeft.attributedText
【讨论】:
以上是关于为啥我经常在这段代码中得到 ExcBadAccess:的主要内容,如果未能解决你的问题,请参考以下文章
为啥 view2 没有出现在这段代码中? (将 UIView 2 合并到 UIView 1 中)
React Native datetimepicker 问题。在这段代码中为啥 Platform.OS==='ios'?true:false?