从添加条目的方法退出后,NSMutableDictionary条目已损坏

时间:2016-09-28 20:23:25

标签: macos nsmutabledictionary corruption

我使用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;

我发现即使在花了几个小时制定它之后,这个问题也难以清楚地问清楚。我道歉。

我已经尝试了大约一周的所有事情。我很难过。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

根据this entry on Enumeration,当您使用快速枚举语法迭代字典时,您将迭代其键。在上面的代码示例中,您假设枚举发生在其值上。你实际做的是将NSString对象转换为Rresource,并向它发送一个只有实际Rresource对象可以响应的选择器。

这应该修复循环:

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