2013-05-09 2 views
2

я просто реализовать мой класс[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. Я не знал, какая проблема. Вы можете мне помочь ?

ответ

3

Посмотрите на документы для 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).