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];
    }
}
4

2 に答える 2

1

はい、ここで説明したように、必ず変更可能なコピーを作成する必要があります。NSDictionary(不変)のインスタンスをNSMutableDictionary-valuedプロパティに割り当てても、コンパイラは文句を言わない場合がありますが、格納されたオブジェクトでいずれかの変更メソッドを呼び出すと、実行時例外が発生します。可変型の変数に割り当てられた不変のコレクションを自動的に可変にする言語やフレームワークには魔法はありません。

prepareForSegueまた、別の回答に記載されているように、プロパティを後でではなく、初めて(で)割り当てるときに、可変コピーを実行する必要があります。

于 2012-10-10T21:20:04.863 に答える
1

可変コピーを作成する必要がありますが、実装が間違っています。

prepareForSegue、を実行する必要があります。そうしないとmutableCopy、プロパティに間違ったオブジェクトが既に保存されています。でそれを行う理由はなくviewDidLoad、バグと見なすことができます。

于 2012-10-10T21:25:20.830 に答える