1

我正在读一本书,我偶然发现了这件事。在我的 ViewController 中,当用户单击更改日期按钮时,调用以下代码:

- (IBAction)changeDate:(id)sender {

    DateViewController *vc = [[DateViewController alloc] init];

    [vc setItem: item];

    [[self navigationController] pushViewController:vc animated:YES];

}

item是一个指向自定义类对象的指针,它的类型为 ivar NSDate *

现在,DateViewController当用户已经选择了新日期并想要导航到上一个视图时,我有以下代码:

- (void)viewWillDisappear:(BOOL)animated
{
    NSLog(@"%@", [datePicker date]);

    item.dateCreated = [datePicker date]; // get selected date
}

此代码有效,当用户从上述代码返回时,更改会反映在item数据结构中,用户可以看到新日期。但是,如果我将上面的代码更改为以下代码,它就不再起作用了,有什么线索吗?

(这不起作用

- (IBAction)changeDate:(id)sender {

    DateViewController *vc = [[DateViewController alloc] init];

     vc.userDate = currentItem.dateCreated;

    [[self navigationController] pushViewController:vc animated:YES];

}

日期视图控制器:

- (void)viewWillDisappear:(BOOL)animated
{
    NSLog(@"%@", [datePicker date]);

    self.userDate = [datePicker date];
 }
4

1 回答 1

0

在第一种情况下,item是一个可变实例,因为您可以更改它包含的日期。在第二种情况下,您提供的NSDate是不可变的自身。

因此,在第一种情况下,您传递一个item可以编辑的引用,这些编辑稍后可用。

但是,第二种情况不会编辑原始日期,它只是将选择的日期存储到视图控制器上的一个属性中,该属性正在被解除。

通常,最好使通信清晰,因此视图控制器将通过委托将选择的日期传递回调用者,或者提供一个属性(如在您的第二种情况下),一旦做出选择就可以查询该属性。item您的第一个选项是通过在显示第二个视图控制器时共享实例来有效地隐藏数据交换。


不可变意味着对象本身(其内容)不能更改。它不会阻止对对象的任何引用被更改。如果我们使用数组(其中有可变的和不可变的版本)来演示:

NSArray *a = [NSArray array];
NSArray *b = a;
[b editSomething]; // illegal (not a true method name but just an example of something you might want to try)
b = nil; // just nils b, no affect on a at all

NSMutableArray *a = [NSArray array];
NSMutableArray *b = a;
[b addObject:@"String"]; // edits a, because a and b are the same object
b = nil; // just nils b, no affect on a at all

NSArray就像你刚刚通过的情况NSDate。这NSMutableArray就像您通过的情况item(因为您可以更改内容)。

于 2013-08-01T12:07:43.963 回答