2012-10-10 42 views
0

在我的prepareForSegue方法中,我将从NSUserDefaults检索到的不可变数组传递给DetailViewController可变字典属性。在修改数组之前是否需要创建数组的可变副本,或者是否在NSMutableDictionary类设置方法中自动发生?将不可变数组传递给可变属性

我的代码...

ViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"EditReminder"]) 
    { 
     UINavigationController *navigationController = segue.destinationViewController; 
     DetailViewController *detailViewController = [[navigationController viewControllers] objectAtIndex:0]; 
     detailViewController.delegate = self; 
     [detailViewController setTitle:@"Edit Reminder"]; 
     // Pass ReminderData to detailVC if editing 
     NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow]; 
     NSArray *remindersArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"reminders"]; 
     detailViewController.reminderData = [remindersArray objectAtIndex: selectedRowIndex.row]; 
    } 
} 

DetailViewController.h

@property (strong, nonatomic) NSMutableDictionary *reminderData; 

DetailViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (self.reminderData) { 
     // Reminder data from user defaults is immutable. Create mutable copy. 
     // Is this necessary? 
     self.reminderData = [self.reminderData mutableCopy]; 
    } 
    else { 
     self.reminderData = [[NSMutableDictionary alloc] init]; 
    } 
} 

回答

1

您需要创建可变副本,但是您的实现是错误的。

prepareForSegue中,您需要执行mutableCopy,或者您的财产中已存有错误的对象。 viewDidLoad没有理由这么做,它可以被认为是一个错误。

1

是的,你一定要创建一个可变的复制,如你在这里所示。如果将NSDictionary(不可变)的实例赋值给NSMutableDictionary -valued属性,但编译器可能不会投诉,但调用存储对象上的任何变异方法将导致运行时异常。在语言或框架中没有任何魔术可以使分配给可变类型变量的不可变集合自动变为可变。

另外,正如另一个答案中指出的那样,当您第一次分配属性(在prepareForSegue中)时,应该执行可变副本,而不是在以后的时间。

相关问题