视图控制器之间的IOS数据

视图控制器之间的IOS数据,ios,viewcontroller,ivar,Ios,Viewcontroller,Ivar,我有一个带有两个视图控制器a和B的导航控制器 A和B都有一个属性 @property (strong, nonatomic) NSString *string; 字符串在控制器A中创建并传递给控制器B ViewControllerB.string = self.string; [self.navigationController pushViewController:ViewControllerB]; 在视图控制器B中,字符串被修改,当我弹出视图控制器A时,字符串的值没有改变 因为它们都有对

我有一个带有两个视图控制器a和B的导航控制器

A和B都有一个属性

@property (strong, nonatomic) NSString *string;
字符串在控制器A中创建并传递给控制器B

ViewControllerB.string = self.string;
[self.navigationController pushViewController:ViewControllerB];
在视图控制器B中,字符串被修改,当我弹出视图控制器A时,字符串的值没有改变

因为它们都有对它的强引用,所以两个视图控制器中的字符串不都应该更改吗

我错过什么了吗

在视图控制器B中,字符串被修改

这是不可能的,因为您使用的是
NSString
,而不是
NSMutableString
。如果在
ViewControllerB
中更换它:

self.string = @"some other string";
然后将
ViewControllerB
string
属性设置为引用该新字符串,但对原始字符串的其他引用不受影响


如果确实希望两个视图控制器修改相同的字符串,请使用
NSMutableString
。但共享可变状态可能不好。相反,考虑使用中介类(比如数据源),或者使用“<代码> ViewControllerB < /代码>的委托模式来手工编写代码> ViewControllerA < /COD>一个更新的字符串。

在该设置中,我认为处理它最好的方法是委托或可能使用块。我稍后会尝试发布一些例子。听起来你的困惑是因为误解了按引用传递和按值传递之间的区别。查看此链接了解更多详细信息:我得到的印象是,这里的问题不是字符串的修改,我猜这只是通过将其设置为另一个字符串来完成的,而是按引用与按值的问题……问题是VCA引用了旧字符串,而VCB引用了新字符串。OP希望VCB的新字符串传播回VCA,但由于VCB正在创建一个新字符串,而不是修改现有字符串,因此不会发生这种情况。正如我所说,这是因为该字符串是按值传递的,而他似乎希望该字符串的行为类似于按引用传递。为什么将其更改为NSMutableString实例可以解决此问题?@Mike使用
NSMutableString
,OP可以使用新数据修改相同的字符串对象。VCA和VCB都有对同一可变字符串的引用。如果它们共享同一个引用,则其可变与否的差异较小,具体取决于OP中“修改”的含义。如果他的意思是
string=@“anotherString”
,那么使其可变并没有什么区别。我并不是真的不同意你的解决方案,但你的答案的重点似乎是字符串的易变性,根据这个问题,我个人认为by ref/by val可能是他最困惑的地方。如果他试图以与可变字符串相同的方式修改普通字符串,他将得到一组不同的警告/错误。