访问不可变字符串的旧值

时间:2015-03-01 19:01:50

标签: objective-c nsstring immutability

所以我写了这段代码:

        NSString *str1=@"string 1";
        NSString *str2=@"string 2";


        NSLog(@"str2 is: %@", str2);

        str2=[str1 stringByAppendingString:str2];
        NSLog(@"str2 is: %@",str2);

它给出了以下输出:

2015-03-01 17:11:16.600 er [956:32910] str2是:string 2

2015-03-01 17:11:16.601 er [956:32910] str2是:string 1string 2

所以str2现在指向内存中的不同位置。有没有办法访问旧的指针str1或立即杀死它?

1 个答案:

答案 0 :(得分:1)

通常不会,在为对象指针指定新值后,旧对象会被释放。如果还有其他指针,它将保留在内存中。因此,如果你想保持一个对象,请保留一个指向它的指针。

添加

 NSString *oldStr2 = str2;

在重新分配str2之前你保留它。否则你无法知道对象是留在内存中还是消失了。如果它留在内存中你不知道它在哪里,因为你没有指向它的指针。

即使你能以某种方式找到这个对象而没有引用它仍然是更好的代码,以明确你以后想要通过设置一个新的引用再次访问它。

对于常量字符串,例如在您的示例中有例外。那些内置于可执行文件中并始终可用 - 它们无法消失。但如果你没有指针,你仍然无法再访问它们。