2013-10-15 2 views
1

UPDATE: Теперь работает (добавлены исправления, как предложил - Спасибо!)Невозможно создать изменяемую копию NSDictionary

Я пытался клонировать 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 
+1

Ваши ключи являются строками, но вы создаете 'pp', используя NSNumber для ключа. Я думаю, вы хотите '[mCopy objectForKey: @" 1 "]' – ChrisH

ответ

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 экземпляра (поэтому они никогда не могут совпадать).

0

Вы можете попробовать:

mCopy = [mNsd mutableCopy]; 
[mCopy retain] 

Одна теория состоит в том, что mutableCopy возвращает это autoreleased объект, и это быть убитым перед функцией btn_click пожаров. Согласно этому сообщению: Retain/release of returned objects, mutableCopy не должен автореализовать массив, но ошибки происходят.

Else, возможно, попробуйте выполнить итерацию с помощью for-loop.

int cnt = [arnames count]; 
for(int i=0; i<cnt; i++) 
... 
Смежные вопросы