调用setter方法导致未识别选择器错误

3
我正在尝试对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;
}

不要为此子类化NSString。那是一个糟糕的设计。创建一个NSObject子类,其中包含两个字符串属性。 - rmaddy
1个回答

3
这是导致您的代码出错的行:

newFurigana = [components objectAtIndex:1];

它用一个NSString对象替换了你使用[[Furigana alloc] init]分配的对象,后者无法响应setForKanji:选择器。

这个赋值操作替换了newFurigana对象,而不是它的内容。内容不能改变,因为你从NSString派生出来,而后者是不可变的

init替换为initWithString,然后从它里面调用[super initWithString:],并使循环中的初始化看起来像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接