从NSAttributedString子类调用super的initWithAttributedString:方法时无法识别的选择器错误

时间:2011-12-02 18:38:58

标签: objective-c ios xcode

我正在试图完成最简单的任务......我的头发已经完成了...继承NSAttributedString。试图调用超类的initWithAttributedString:方法导致无法识别的选择器被发送到实例错误。

MODAttributedString.h:

#import <Foundation/Foundation.h>

@interface MODAttributedString : NSAttributedString

@property (nonatomic, retain) NSDictionary *links;

+ (MODAttributedString*) attributedStringWithFormat:(NSString*)text args:(id)argOne, ... NS_REQUIRES_NIL_TERMINATION;
+ (MODAttributedString*) attributedStringWithFormat:(NSString*)text attributes:(NSDictionary*)attributeDict;

@end

导致崩溃的代码(我将在稍后解释我从init分配alloc的原因):

MODAttributedString *modString = [MODAttributedString alloc];
// Pausing debugger here and typing 'po modString' causes gdb error
modString = [modString initWithAttributedString:attributedString];

我唯一的线索是踩过alloc调用,当我尝试po modString时,我给出了这个错误:

“正在调试的程序在从gdb调用的函数中遇到ObjC异常。 如果你不想要异常抛出来中断gdb调用的函数 将objc-exceptions-interrupt-hand-call-fns设置为off。 GDB已将上下文恢复到调用之前的状态。 要更改此行为,请使用“set unwindonsignal off” 评估包含该函数的表达式(_NSPrintForDebugger)将被放弃。“

如果我暂时将MODAttributedString的超类更改为UIView,则alloc不会导致gdb错误(我在init之前停止调试器,这显然不适用于除了属性字符串之外的任何内容)。但是,像NSArray,NSDictionary和NSAttributedString这样的常见类都会失败并出现相同的错误。

在调用[MODAttributedString alloc]的方法中,我使用NSAttributedString作为自己的独立类就好了。我确信我也在这个.m文件中包含MODAttributedString标头。

我正在使用Xcode 4.2和iPhone 5模拟器。我已多次清理项目,尝试创建一个新项目,尝试使用LLVM GCC 4.2和Apple LLVM 3.0,重新启动Xcode并重新启动我的机器都没有成功。我在发布之前大量搜索了这个特定的问题,但我只发现了与属性相关的问题,而不是超类的公共方法。

这是构建设置问题吗?配置错误?编译器错误?我已经将常见的Apple类子类化了数百次,并且出于某种原因,这是我第一次遇到问题。还有其他人遇到过类似的问题吗?这可能是一个非常简单的修复,但我似乎无法自己解决这个问题。

提前致谢!

1 个答案:

答案 0 :(得分:3)

这不是“最简单的事情”。您不能将NSAttributedString子类化 - 它是类集群的一部分。这意味着(除其他事项外)实例化时返回的类不一定是您要求的类。见What exactly is a so called "Class Cluster" in Objective-C?

在类集群中进行子类化是非常困难和困难的,但我的建议是编写一个包装类;你会更快乐。 Cocoa对未处理方法的动态重定向使这很容易。