【问题标题】:Unable to create mutable copy of NSDictionary无法创建 NSDictionary 的可变副本
【发布时间】:2013-10-15 17:52:22
【问题描述】:

更新:现在工作(根据建议添加了修复 - 谢谢!)

我一直在尝试克隆NSDictionary 的员工信息。主要的NSDictionary 在不同的类中创建并在prepareForSegue 中传递。我希望能够在另一个类中创建该NSDictionary 的可变副本,然后可以更新员工信息并将其发送到另一个类进行处理,这样我以后仍然可以使用原始未更改的数据集。我在 Stack 上找到了一些不同的示例,但没有什么可以开始工作。当我中断btn_click 方法并在..objectForKey 调用之后检查本地pp 对象时,pp 仍然为零。我在这里做错了什么?

obj_person.h

#import <Foundation/Foundation.h>

@interface obj_person : NSObject
@property (strong,nonatomic)  NSString *personID;
@property (strong, nonatomic) NSString *personName;
@property (strong, nonatomic) NSString *personTitle;
@end

obj_person.m

#import "obj_person.h"

@implementation obj_person
@synthesize personID = _personID;
@synthesize personName = _personName;
@synthesize personTitle = _personTitle;

@结束

viewcontroller.m

#import "ViewController.h"
#import "obj_person.h"

@interface ViewController ()

@end

@implementation ViewController

int mCounter = 1;
NSMutableDictionary *mCopy;
NSMutableDictionary *mNsd;

- (void)viewDidLoad
{
   [super viewDidLoad];

   NSArray *arnames = [[NSArray alloc] initWithObjects:@"mary", @"jane", @"stan", @"cartman", nil];
   NSArray *arkeys = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2],[NSNumber numberWithInt:3], [NSNumber numberWithInt:4], nil];
   mNsd = [[NSMutableDictionary alloc] initWithCapacity:[arnames count]];

   int i = 0;
   for (NSString *name in arnames)
   {
      obj_person *p = [[obj_person alloc] init];
      p.personID = [arkeys objectAtIndex:i];
      p.personName = name;

      [mNsd setObject:p forKey:p.personID];
      i++;
   }

   mCopy = [mNsd mutableCopy];
}

- (IBAction)btn_click:(id)sender
{
   NSLog (@"%d original items", [mNsd count]);
   obj_person *pp = [mCopy objectForKey:[NSNumber numberWithInt:mCounter]];
   NSLog(@"%@", pp.personName);
   pp.personName = @"Gerald";

   if (++mCounter > [mCopy count])
      mCounter = 1;
}

@end

【问题讨论】:

  • 您的键是字符串,但您正在创建 pp 通过使用 NSNumber 作为键。我想你想要[mCopy objectForKey:@"1"]

标签: objective-c nsdictionary


【解决方案1】:

不要定义:

NSMutableDictionary *mCopy;
NSMutableDictionary *mNsd;

@interface@implementation 之外。它们应该是实例变量,所以定义实例变量或使用属性来定义它们。

你不使用n 来自:

for (NSArray *n in arnames)

因为它不是NSArray,而是NSString。你应该解决这个问题,你可能应该把它命名为比 n 更好的名称并使用它。

这个:

obj_person *pp = [mCopy objectForKey:[NSNumber numberWithInt:1]];

失败,因为您最初存储的密钥是​​ NSString 实例,而您用来尝试获取数据的东西是 NSNumber 实例(因此它们永远无法匹配)。

【讨论】:

    【解决方案2】:

    你可以试试:

    mCopy = [mNsd mutableCopy];
    [mCopy retain]
    

    一个理论是 mutableCopy 返回的是一个自动释放的对象,它在 btn_click 函数触发之前被杀死。根据这篇文章:Retain/release of returned objects,mutableCopy 不应该自动释放数组,但确实会发生错误。

    否则,也许可以尝试使用 for 循环进行迭代。

    int cnt = [arnames count];
    for(int i=0; i<cnt; i++) 
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2013-07-22
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多