子类化NSMutableAttributedString在init上返回SIGABRT

时间:2014-02-11 02:48:25

标签: ios objective-c nsattributedstring

我在我的一个项目中创建了一个NSMutableAttributedString的子类,以创建一个字符串,该字符串不断地将每个字符更改为init中数组中给出的颜色之一,但是当我尝试调用init方法时,我得到一个{{ 1 {} sigabrt方法。

RainbowString.h

initWithString:

initWithColors:

#import <Foundation/Foundation.h>

@interface RainbowString : NSMutableAttributedString

@property (nonatomic) NSArray* colors;
@property (nonatomic) NSTimeInterval duration;
@property (nonatomic) NSTimer* timer;

- (id)initStringWithColors:(NSArray*)colors withString:(NSString*)string;
- (id)initStringWithColors:(NSArray*)colors withCycleDuration:(NSTimeInterval)duration withString:(NSString*)string;

- (void)stop;
- (void)start:(NSTimeInterval)duration;

@end 

即使我只是致电- (id)initStringWithColors:(NSArray *)colors withString:(NSString *)string { self = [super initWithString:string]; if(self) { [self setColors:colors]; [self cycle]; } return self; } ,我也会收到同样的错误:

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [RainbowString initWithString:]:无法识别的选择器发送到实例0x166778c0'

更新

好的,为了测试这个,我创建了一个NSMutableAttributedString的测试子类,绝对没有内容。我刚刚创建了子类并保持原样。

Test.h

[[RainbowString alloc] initWithString:@"Hello"];

我跑了:

#import <Foundation/Foundation.h>

@interface Test : NSMutableAttributedString

@end

那跑得很好。但后来我跑了:

[[NSMutableAttributedString alloc] initWithString:@"Hello"];

同样的错误。我不允许继承子类NSMutableAttributedString吗?

2 个答案:

答案 0 :(得分:6)

你的结论是正确的。 NS(Mutable)AttributedStringclass cluster,并且对这些内容进行子类化并不起作用。遗憾的是,Apple文档并未将其明确标识为一个。

答案 1 :(得分:0)

对于未来的搜索者,this gist可能很方便。它是NSAttributedString的一个子类,它通过组合重新实现NSAttributedString的公共接口 - 对public方法的调用被传递给NSAttributedString的内部实例。

我不会将它用于生产代码,但有时当你想在开发过程中临时检测NSAttributedString的各个方面时它是一个有用的起点。