[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
).