调用setter会产生无法识别的选择器错误

时间:2014-08-09 19:38:37

标签: ios objective-c xcode subclass unrecognized-selector

我试图将NSString子类化为它赋予另一个NSString属性。无论我尝试使用@synthesize或@dynamic还是手动编写我的setter和getter,我都会将这个"无法识别的选择器发送到实例"编译时出错。

我知道这可能已经得到了回答,但是在查看了其他15个未被识别的选择器"在这个网站上的问题我仍然不知所措。对不起,我最近开始编写代码,所以我可能只是错过了一些非常简单的东西。

Furigana.h

@interface Furigana : NSString

@property (strong, nonatomic) NSString *forKanji;

-(void)setForKanji:(NSString *)forKanji; //fails the same with or without this line

@end

Furigana.m

#import "Furigana.h"

@implementation Furigana
@synthesize forKanji = _forKanji;
//@dynamic forKanji; tried this

-(NSString *)forKanji { //also fails when custom setter/getters are left out
    if(!_forKanji) _forKanji = [[NSString alloc] init];
    return _forKanji;
}

-(void)setForKanji:(NSString *)forKanji {
    if(!_forKanji) _forKanji = [[NSString alloc] init];
    _forKanji = forKanji;
}

@end

Reibun.m

#import "Furigana.h"

-(NSArray *)parseFurigana:(NSArray *)unparsedData {
    NSMutableArray *furigana = [[NSMutableArray alloc] init]; //of Furigana
    for(unsigned int x = 0; x < [unparsedData count]; x++){
        NSArray *components = [[NSArray alloc] init];
        components = [[unparsedData objectAtIndex:x] componentsSeparatedByString:@":"];
        Furigana *newFurigana = [[Furigana alloc] init];
        newFurigana = [components objectAtIndex:1];
        NSLog(@"stored string: %@",newFurigana); //so far so good
        newFurigana.forKanji = [components objectAtIndex:0]; //crash
        //[newFurigana setForKanji:[components objectAtIndex:0]]; //this fails too
        [furigana addObject:newFurigana];
    }
    return furigana;
}

1 个答案:

答案 0 :(得分:2)

以下是破坏代码的行:

newFurigana = [components objectAtIndex:1];

使用[[Furigana alloc] init]替换您使用NSString分配的对象,该对象不响应setForKanji:选择器。

分配取代newFurigana对象,而不是其内容。内容无法更改,因为您派生自NSString不可变

init替换为initWithString,从中调用[super initWithString:],然后在循环中进行初始化,如下所示:

Furigana *newFurigana = [[Furigana alloc] initWithString:[components objectAtIndex:1]];