2016-09-28 1 views
0

J'utilise setObject: forKey: pour ajouter un objet de type Rresource à un NSMutableDictionary nommé: resourceLib.Entrée NSMutableDictionary corrompue après s'être écartée de la méthode où l'entrée a été ajoutée

Ensuite, je regarde immédiatement ce qui est réellement dans le dictionnaire et c'est OK.

Lorsque je tente de regarder à nouveau dans la méthode d'un autre objet, la clé appropriée est présente, mais une référence à une propriété de chaîne « url » cas d'une liste de messages d'erreur comprenant:

28/09/2016 11 : 32: 42.636 testa [760: 16697] - [__ url NSCFString]: sélecteur non reconnu envoyé à l'instance 0x600000456350

objet Rresource est défini comme:

@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; 

Cette méthode dans un ViewController ajoute le Rresource au 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]; 
    } 
} 

}

ressources et la température contiennent les informations identiques montrant l'info a été ajouté correctement.

Dans la méthode du modèle, le message d'erreur décrit ci-dessus est à l'origine de ce qui suit.

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

où le modèle contient:

@property(nonatomic,strong)NSMutableDictionary* resourceLib; 

et:

@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; 

J'ai trouvé cette question difficile de poser clairement, même après avoir passé plusieurs heures formuler. Je m'excuse. J'ai essayé à peu près tout depuis environ une semaine. Je suis perplexe.

Des idées?

Merci

Répondre

0

Selon this entry on Enumeration, lorsque vous itérer sur un dictionnaire en utilisant la syntaxe d'énumération rapide, vous itérer sur ses clés. Dans l'exemple de code ci-dessus, vous supposez que l'énumération se produit sur ses valeurs. Qu'est-ce que vous faites effectivement est de lancer un objet NSString comme Rresource, et en lui envoyant un sélecteur seulement un objet réel Rresource peut répondre.

Cela devrait fixer la boucle:

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

C'était-ce! Merci beaucoup! –