发现异常"无法识别的选择器发送到实例"仅在iOS6中出现

时间:2015-02-17 14:06:49

标签: ios ios6 unrecognized-selector

我的iPhone应用程序中出现异常,

-[__NSCFString sizeWithAttributes:]: unrecognized selector sent to instance,

当我开始使用iOS6.1的应用程序时,在iOS7或更高版本下一切正常。 我项目中iOS6和更高版本之间的唯一区别是XIB。按下按钮时发生错误。 也许它来自不同的XIB,也许不是。

它看起来像是内存泄漏,但我无法弄清楚它为什么会发生。 尝试从按钮计算文本大小时发生异常。

我设置Exception-breakpoints来查找错误。 这里有一些来自stacktrace的信息:

在此方法中会发生错误:

- (float) calculateButtonWidth:(TypeButtonRest*) typeButtonRest{

    UIFont *font = [UIFont boldSystemFontOfSize:16];
    NSDictionary *userAttributes = @{NSFontAttributeName: font,
                     NSForegroundColorAttributeName: [UIColor blackColor]};
    const CGSize textSize = [[typeButtonRest text] sizeWithAttributes: userAttributes];
    ...

从这里调用该方法:

- (ButtonMatrixInfos*) calculateButtonSchema:(NSMutableArray*) buttons screenWidth:(double)screenWidth minMargin:(double)minMargin{
    ButtonMatrixInfos *returnValue = [[[ButtonMatrixInfos class] alloc] init];
    int buttonCount = [buttons count];
    [buttons retain];
    for (int i=0; i < buttonCount; i++) {
        float curWidth = [self calculateButtonWidth:[buttons objectAtIndex:i]];
        maxButtonWidth = curWidth > maxButtonWidth ? curWidth : maxButtonWidth;
    }
    ...

我的假设是,buttons已损坏。他们来自这里:

-(RadioButtonContainer*)addRadioButtons:(NSMutableArray *)buttons withButtonGroupName:(NSString*) groupName andMarginLeft:(int) marginLeft andMarginRight:(int) marginRight preselected:(NSString*) preselected {
ButtonListLayouter *bll = [[[[ButtonListLayouter class] alloc] init]retain];   
ButtonMatrixInfos *bmi = [bll calculateButtonSchema:buttons screenWidth:(screenSize.width - marginLeft - marginRight) minMargin:5];
...

在这里创建:

NSMutableArray *buttonsRest = [[[NSMutableArray alloc] init]retain];
for (int i=0; i < [buttons count]; i++) {
    TypeButtonRest *tpr = [[[[TypeButtonRest class] alloc] init]retain];
    tpr.text = [[buttons objectAtIndex:i] objectForKey:@"value"];
    tpr.key = [[buttons objectAtIndex:i] objectForKey:@"key"];
    [buttonsRest addObject:tpr];
}

我希望这段代码片段可以提供帮助。

最好的问候

1 个答案:

答案 0 :(得分:3)

sizeWithAttributes仅适用于iOS 7.0。您想在iOS 6中使用sizeWithFont。阅读更多here