[MyClassName copyWithZone:]: нераспознанный селектор отправлен на экземпляр?

Я только что реализовал свой класс

@interface ExampleNestedTablesViewController ()
{
    NSMutableArray *projectModelArray;
    NSMutableDictionary *sectionContentDictionary;

}

- (void)viewDidLoad
{
    [super viewDidLoad];

    ProjectModel *project1 = [[ProjectModel alloc] init];
    project1.projectName = @"Project 1";

    ProjectModel *project2 = [[ProjectModel alloc] init];
    project2.projectName = @"Project 2";
    if (!projectModelArray)
    {
        projectModelArray = [NSMutableArray arrayWithObjects:project1, project2, nil];
    }

    if (!sectionContentDictionary)
    {
        sectionContentDictionary  = [[NSMutableDictionary alloc] init];

        NSMutableArray *array1     = [NSMutableArray arrayWithObjects:@"Task 1", @"Task 2", nil];
        [sectionContentDictionary setValue:array1 forKey:[projectModelArray objectAtIndex:0]]; // **this line crashed**.

    }
}

Вот моя модель проекта

@interface ProjectModel : NSObject

typedef enum
{
    ProjectWorking = 0,
    ProjectDelayed,
    ProjectSuspended,

} ProjectStatus;

@property (nonatomic, assign) NSInteger idProject;
@property (nonatomic, strong) NSString* projectName;
@property (nonatomic, strong) NSMutableArray* listStaff;
@property (nonatomic, strong) NSTimer* projectTimer;
@property (nonatomic, assign) ProjectStatus projectStatus;
@property (nonatomic, strong) NSMutableArray* listTask;
@property (nonatomic, assign) NSInteger limitPurchase;
@property (nonatomic, strong) NSDate* limitTime;
@end

И вывод: SDNestedTablesExample[1027:c07] -[ProjectModel copyWithZone:]: нераспознанный селектор, отправленный экземпляру 0x7562920. Я не знал, какая проблема. Вы можете мне помочь?

1 ответ

Посмотрите на документы для NSMutableDictionary setObject:forKey: (обратите внимание, вы должны использовать setObject:forKey:не setValue:forKey:). Обратите внимание на ожидаемый тип ключа. Это должно быть типа id<NSCopying>, Это означает, что ключ должен соответствовать NSCopying протокол.

Так как ваши ключи имеют тип ProjectModel, ошибка жалуется, так как ваш ProjectModel класс не реализует необходимый метод NSCopying протокол - copyWithZone:,

Вы уверены, что хотите использовать ProjectModel объект как ключ? Это также означает, что вам нужна разумная реализация isEqual: а также hash методы, в дополнение к copyWithZone,

Решение состоит в том, чтобы обновить ваш ProjectModel класс, так что соответствует NSCopying протокол и реализует copyWithZone: метод. А также правильно реализовать isEqual: а также hash методы. Или измените ключ, чтобы быть просто idProject свойство (правильно обернутый как NSNumber).

Другие вопросы по тегам