我正在读一些书,我偶然发现了这件事。 在我的ViewController中,当用户单击下面的更改日期按钮时 代码被称为:
- (IBAction)changeDate:(id)sender {
DateViewController *vc = [[DateViewController alloc] init];
[vc setItem: item];
[[self navigationController] pushViewController:vc animated:YES];
}
item
是指向自定义类对象的指针,该对象具有NSDate *
类型的ivar;
现在,当用户已选择新日期并且想要时,在DateViewController
内
要导航到上一个视图,我有以下代码:
- (void)viewWillDisappear:(BOOL)animated
{
NSLog(@"%@", [datePicker date]);
item.dateCreated = [datePicker date]; // get selected date
}
此代码有效,当用户从上面返回时,代码更改会被反映出来
在item
数据结构中,用户可以看到新的日期。但是,如果我将上面的代码更改为以下代码,它将不再起作用,任何线索为什么?
( NOT 工作):
- (IBAction)changeDate:(id)sender {
DateViewController *vc = [[DateViewController alloc] init];
vc.userDate = currentItem.dateCreated;
[[self navigationController] pushViewController:vc animated:YES];
}
DateViewController:
- (void)viewWillDisappear:(BOOL)animated
{
NSLog(@"%@", [datePicker date]);
self.userDate = [datePicker date];
}
答案 0 :(得分: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
的情况一样(因为您可以更改内容)。