【问题标题】:Passing immutable array to mutable property将不可变数组传递给可变属性
【发布时间】:2012-10-10 21:16:22
【问题描述】:

在我的 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];
    }
}

【问题讨论】:

    标签: objective-c ios immutability nsmutabledictionary


    【解决方案1】:

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

    prepareForSegue 中,您需要执行mutableCopy,否则您的属性中已经存储了错误的对象。在viewDidLoad 中没有理由这样做,它可以被认为是一个错误。

    【讨论】:

      【解决方案2】:

      是的,您肯定需要创建一个可变副本,如此处所示。如果您将NSDictionary(不可变)的实例分配给NSMutableDictionary-valued 属性,编译器可能不会抱怨,但在存储对象上调用任何变异方法都会导致运行时异常。语言或框架中没有任何魔法可以使分配给可变类型变量的不可变集合自动可变。

      此外,正如另一个答案中所述,您应该在首次分配属性时(在 prepareForSegue 中)执行可变副本,而不是稍后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多