2012-10-10 41 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中)時,應該執行可變副本,而不是在以後的時間。

相關問題