我试图理解Objective-C中的解引用,并编写了以下两种方法。
-(void)alterStringModelOne:(NSMutableString**)string{
NSMutableString *str = [NSMutableString stringWithString:@"New string by string = &str"];
string = &str; //Didn't work
}
-(void)alterStringModelTwo:(NSMutableString**)string{
NSMutableString *str = [NSMutableString stringWithString:@"New string by *string = str"];
*string = str; //It works
}
以上,ModelOne无法工作而ModelTwo可以。这两个语句有什么不同?
编辑:跟踪它们的地址和类型
myStr = b260 类型为 * CFString
---> 进入模型一方法
string = d9c4 类型为 ** NSMutableString //参数
str = f750 类型为 * CFString //创建 str 后
string = d97c 类型为 ** NSMutableString //分配后:string = &str
--> 方法返回
myStr = b260 类型为 * CFString
--> 进入模型二方法
string = d9c4 类型为 ** NSMutableString //参数
str = 0bc0 类型为 * CFString //创建 str 后
string = 0bc0 类型为 * CFString //分配后:*string = str;
--> 离开方法
myStr = 0bc0 类型为 * CFString
str
是一个本地变量,当你从方法返回时,它的存储就会消失。取它的地址就是取垃圾的地址。 - Hot Licks