2016-09-28 6 views
0

Я использую setObject: forKey: добавить объект типа Rresource в NSMutableDictionary с именем: resourceLib.Запись NSMutableDictionary повреждена после отклонения от метода, в котором была добавлена ​​запись

Затем я сразу же посмотрю, что на самом деле находится в словаре, и все в порядке.

Когда я пытаюсь смотреть на него снова в методе другого объекта, правильный ключ присутствует, но ссылка на свойства строки «URL» случаи список сообщений об ошибках, в том числе:

2016-09-28 11 : 32: 42.636 Testa [760: 16697] - [__ NSCFString URL]: непризнанные селектор направлен например 0x600000456350

Rresource объекта определяется как:

@interface Rresource : NSObject 
@property (nonatomic,strong) NSString* url; 
@property (nonatomic,strong)NSMutableArray* resourceNotesArray; 
@property(nonatomic,strong)NSString* name; 
@property(nonatomic,strong)NSString* resourceUniqueID; 
@property(nonatomic)BOOL isResourceDirty; 

Этот метод в ViewController добавляет Rresource к NSMutableDictionary

-(void)saveResource 
{ 
Rresource* resource = self.currentResource; 
Rresource* temp; 
if (resource) 
{ 
    if (resource.isResourceDirty) 
    { 
     [self.model.resourceLib setObject:resource forKey:resource.resourceUniqueID]; 
     temp = [self.model.resourceLib objectForKey:resource.resourceUniqueID]; 
    } 
} 

}

ресурсы и температуры содержат одинаковую информацию, показывающую информацию правильно добавили.

В способе модели следующее сообщение об ошибке, описанное выше.

for (Rresource* resource in self.resourceLib) 
{ 
    NSString* string = resource.url; 
} 

где модель содержит:

@property(nonatomic,strong)NSMutableDictionary* resourceLib; 

и:

@implementation Model 


- (instancetype)init 
{ 
self = [super init]; 
if (self) 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
    self.path = [[paths objectAtIndex:0] stringByAppendingString:@"/Application Support/E2"]; 
    BOOL exists = [[NSFileManager defaultManager] createDirectoryAtPath:self.path withIntermediateDirectories:NO attributes:nil error:nil]; 
    if (!exists) 
    { 
     [[NSFileManager defaultManager] createDirectoryAtPath:self.path withIntermediateDirectories:NO attributes:nil error:nil]; 
    } 
    self.resourceLibPath = [NSString pathWithComponents:@[self.path,@"resources"]]; 
    self.resourceLib = [[NSMutableDictionary alloc]init]; 
    self.noteLibPath = [NSString pathWithComponents:@[self.path, @"notes"]]; 
    self.noteLib = [[NSMutableDictionary alloc]init]; 
} 
return self; 

Я нашел этот вопрос трудно четко задавать даже после нескольких часов ее сформулировать. Я извиняюсь.

Я пробовал почти все около недели. Я в тупике.

Любые идеи?

Благодаря

ответ

0

Согласно this entry on Enumeration, когда вы перебирать словарь, используя быстрый синтаксис перечисления, вы итерацию над своими ключами. В приведенном выше примере кода вы предполагаете, что перечисление происходит по его значениям. То, что вы эффективно делаете, - это отличить объект NSString как Rresource, и отправив ему селектор, на который может ответить только действительный объект Rresource.

Это должно исправить цикл:

for (NSString* key in self.resourceLib) 
{ 
    NSString* string = [self.resourceLib objectForKey:key].url; 
} 
+0

Это он! Большое спасибо! –