为啥我经常在这段代码中得到 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:的主要内容,如果未能解决你的问题,请参考以下文章

为啥垂直对齐:中间;在这段代码中不起作用? [复制]

为啥在这段代码中 CPU 运行速度比 GPU 快?

为啥在这段代码中向量比指针使用更少的内存?

为啥 view2 没有出现在这段代码中? (将 UIView 2 合并到 UIView 1 中)

React Native datetimepicker 问题。在这段代码中为啥 Platform.OS==='ios'?true:false?

在这段代码中得到“窗口未定义在第18行”,即使我喜欢99%确定我明确定义它显然有些错误但是idk是什么