我试图将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;
}
答案 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]];