вызов сеттера дает нераспознанную ошибку селектора

Я пытаюсь создать подкласс NSString, чтобы дать ему свойство, которое является другим NSString. Независимо от того, что я пытаюсь использовать с @synthesize или @dynamic или вручную кодировать свои сеттеры и геттеры, я продолжаю получать эту ошибку «неопознанный селектор, отправленный в экземпляр» при компиляции.

Я знаю, что на этот вопрос, вероятно, уже был дан ответ, но, просмотрев около 15 других вопросов о «непризнанном селекторе» на этом сайте, я все еще в растерянности. Извините, я начал программировать ОЧЕНЬ недавно, поэтому, вероятно, просто упустил что-то чрезвычайно простое.

Фуригана.ч

@interface Furigana : NSString

@property (strong, nonatomic) NSString *forKanji;

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

@end

Фуригана.м

#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

Рейбун.м

#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;
}

person user3925713    schedule 09.08.2014    source источник
comment
Не делайте для этого подкласс NSString. Это плохой дизайн. Создайте подкласс NSObject с двумя строковыми свойствами.   -  person rmaddy    schedule 10.08.2014


Ответы (1)


Вот строка, которая ломает ваш код:

newFurigana = [components objectAtIndex:1];

Он заменяет объект, который вы выделили с помощью [[Furigana alloc] init], на объект NSString, который не отвечает на селектор setForKanji:.

Присваивание заменяет newFurigana объект, а не его содержимое. Содержимое нельзя изменить, потому что вы наследуете от NSString, которое является неизменяемым.

Замените init на initWithString, вызовите из него [super initWithString:] и сделайте так, чтобы инициализация внутри вашего цикла выглядела так:

Furigana *newFurigana = [[Furigana alloc] initWithString:[components objectAtIndex:1]];
person Sergey Kalinichenko    schedule 09.08.2014