更新:正在运行(按建议添加修补程序 - 谢谢!)
我一直在尝试克隆NSDictionary
员工信息。主NSDictionary
在另一个类中创建,并在prepareForSegue
中传递。我希望能够在另一个类中创建NSDictionary
的可变副本,然后可以更新员工信息并将其发送到另一个类进行处理,这样我仍然可以在以后使用原始未更改的数据集时间。我在Stack上找到了一些不同的例子,但我无法工作。当我暂停btn_click
方法并在pp
调用后检查本地..objectForKey
对象时,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;
@end
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
答案 0 :(得分:3)
不要定义:
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
实例(因此它们永远不会匹配)。
答案 1 :(得分:0)
您可以尝试:
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++)
...