如何以编程方式将字符串和键添加到 iPhone 中的字典?

Posted

技术标签:

【中文标题】如何以编程方式将字符串和键添加到 iPhone 中的字典?【英文标题】:How to add string and key to dictionary in iPhone programmatically? 【发布时间】:2012-10-31 06:41:49 【问题描述】:

我使用以下代码将值写入字典,但是当将新值添加到字典时它不会更新,它只会显示只有最近添加的值的 plist,它也崩溃了。

nameString=nameTxt.text;
NSFileManager *mngr=[NSFileManager defaultManager];
NSArray *docDir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath=[docDir objectAtIndex:0];
NSString *filePath=[docPath stringByAppendingPathComponent:@"score.plist"];
NSString *bundlePath=[[NSBundle mainBundle] pathForResource:@"score" ofType:@"plist"];

if ([mngr fileExistsAtPath:filePath]) 
    NSLog(@"File exists");

else       
    NSLog(@"NO file exists");
    [[NSFileManager defaultManager] copyItemAtPath:bundlePath toPath:filePath error:NULL];      
   

dict=[[NSMutableDictionary alloc]init];
dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"dict is %@",dict);
[dict setObject:nameString forKey:@"100"];
[dict writeToFile:filePath atomically:YES];

[dict release];

当我使用最后一行“[dict release]”时出现崩溃 我的包中有一个 score.plist 文件。

【问题讨论】:

在你的代码中删除这段代码 dict=[[NSMutableDictionary alloc]init];[dict release];,它会起作用 【参考方案1】:

崩溃是因为这条线,

dict=[[NSMutableDictionary alloc]init];
dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

您分配内存的第一行,然后覆盖 dict 参数以链接到不属于您的静态字典。所以旧的被泄露了,当你释放它时,它会尝试释放静态的。

而不是那种用途,

dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

并且不要使用发布声明。既然你不拥有它,你不必释放它。

Check this

【讨论】:

dict=[[NSMutableDictionary alloc]init];create newNSMutableDictionary, dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];只从文件路径复制字典,不会覆盖字典 它将覆盖第一个分配的字典。检查developer.apple.com/library/mac/#documentation/cocoa/conceptual/… dict 存储文件中的数据,dict 在全局中声明 我没明白你的意思。确实,它正在从文件中读取。之后读取的字典归操作系统所有,我们分配给 dict ,这使得它泄漏分配的 dict 对象。因此,当我们发布它时,它会崩溃。请阅读苹果文档以更好地理解这个概念。【参考方案2】:

这是一个简单的记忆问题。除了解决问题,你还必须了解问题。

dict 是您在全局范围内声明的 NSMutableDictionary。这样你就可以分配它来使用它,这样你就不会失去字典的范围。

所以一开始说 'ViewDidLoad:' ,你可以把它分配和初始化为

dict=[[NSMutableDictionary alloc]init];

或者在目前的情况下你可以像这样使用

dict=[[NSMutableDictionary alloc]initWithContentsOfFile: filePath];

这样您就可以使用score.plist 文件分配字典,一切都会正常工作。

在您的情况下发生的事情是您分配了dict。但是在下一行中,您将 dict 的分配对象替换为语句

中的 autoreleaed 对象
dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

由于类方法总是返回自动释放的对象,当你尝试释放自动释放的对象时,它会崩溃。 :-)

希望你明白了。

现在的解决方案是你可以换行

dict=[[NSMutableDictionary alloc]init];

dict=[[NSMutableDictionary alloc]initWithContentsOfFile: filePath];

并删除该行

dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

一切都会奏效。快乐编码。 :-)

【讨论】:

以上是关于如何以编程方式将字符串和键添加到 iPhone 中的字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 中以编程方式在 plist 文件中添加多个数组

在运行时将行和键添加到android中的自定义键盘

以编程方式将视图添加到 UIWebView (iPhone/iPad) 的每个页面

如何以编程方式将音频文件从 iPhone 的文件系统复制到资产库

如何在iphone中以编程方式实现带有背景图像的按钮

如何以编程方式设置 iPhone 闹钟?