我使用setObject:forKey:将类型为Rresource的对象添加到名为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;
}
其中model包含:
@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 :(得分:0)
根据this entry on Enumeration,当您使用快速枚举语法迭代字典时,您将迭代其键。在上面的代码示例中,您假设枚举发生在其值上。你实际做的是将NSString
对象转换为Rresource
,并向它发送一个只有实际Rresource
对象可以响应的选择器。
这应该修复循环:
for (NSString* key in self.resourceLib)
{
NSString* string = [self.resourceLib objectForKey:key].url;
}