作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] obj-c有pass by reference这件事吗?
时间Sun Sep 19 20:16:02 2010
※ 引述《Gsus (肉元,吉米,助教)》之铭言:
: 我写了一小段code
: NSString *aString = @"a";
: NSString *bString = @"b";
: bString = aString;
: ^^^^^^^^^^^^^^^^^^
: aString = @"c";
: NSLog(@"aString = %@", aString);
: NSLog(@"bString = %@", bString);
: aString = bString;
: ^^^^^^^^^^^^^^^^^^
: 这行code看似是pointer assignment,但就结果来看却是value assignment
没有 pointer assignment 这种东西
把一个指标变数的值指定给另一个指标变数, 是完完全全的 value assignment
只是你 assign 的 value 是一个 pointer
回到你的程式
这个状况和传的是什麽值没有关系, 也和是不是参考没有关系, 而是语言行为的问题
在 Objective-C 里, 字面常量本身也是一个物件
当你下 aString = @"c" 时, aString 这个指标指的物件会改变, 不再指向 @"a"
而 bString 仍然指向本来的 @"a"
所以会得到你的结果
这和(例如)C++ 的类似程式码状况有很多不同
在 C++ 中, 用 = 初始化, 是代表以後面的值呼叫建构子
所以如果你写
string aString = "a"; // 等同於 string aString("a");
是代表建立一个 aString, 并把其字串值设为 a
而
NSString *aString = @"a";
则是建立一个字面常量的物件, 其值为 a, 并将 sString 指向该物件
类似地
在 C++ 中为一个变数指定新的字面常量值, 是直接修改该变数代表之物件的内部值
所以承前面的程式, 如果
aString = "c";
是直接修改 aString 指向的物件其值为 c
而另一方面, Objective-C 中
aString = @"c";
是将 aString 指向另一个字面常量物件, 其值为 c
就这段程式而言, 你可以这样写...
NSMutableString *aString = @"a";
// 如果要完全和 C++ 行为一样, 应该写成
// NSMutableString *aString = [NSMutableString stringWithString:@"a"];
NSMutableString *bString = @"b";
bString = aString;
[aString setString:@"c"];
aString = bString;
: 其实是最近遇到一些问题突然让我想起pass by reference的问题....
: P.S. 我遇到的问题是
: 我有一个loginViewController,一个dataViewController & settingsViewController
: 一旦login成功了便会得到userID并传给dataViewController & settingsViewController
: 但是settingsViewController可以让使用者loggout
: 总之这3个viewController都有一个attribute叫做userID
: 然後每当userID有改变时又必须在viewControllers之间同步
: 用protocol用到错综复杂....突然想起pass by reference这件事
: 顺便问一下这种问题该怎麽处理比较好呢?
我想比较好的方法是让一个 controller 负责管理 userID 变数
其他 controller 当要使用 userID 时, 直接向那个 controller 要
你只要改那个 controller 中的 userID 就可以了
如果你想在每个 controller 里都有一份变数
那就是像前面的程式一样, 改用 NSMutableString
当值要修改时, 直接更动原本物件内部的值, 而不是指向新的物件
这样也可以
--
"问おう、贵方が私のマスターか?"
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.243.1.178
1F:推 Gsus:好, 多谢讲解!!! 09/19 21:15