访问不可变字符串的旧值
accessing old values of immutable strings
所以我写了这段代码:
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 是:字符串 2
2015-03-01 17:11:16.601 er[956:32910] str2 是:string 1string 2
所以 str2 现在指向内存中的不同位置。有没有办法访问旧指针 str1 或 arc 立即杀死它?
通常不会,在您将新值分配给对象指针后,旧对象将被释放。如果有其他指向它的指针,它当然会保留在内存中。所以如果你想保留一个对象,请保留指向它的指针。
添加
NSString *oldStr2 = str2;
在重新分配 str2 并保留它之前。否则你无法知道对象是留在内存中还是消失了。如果它留在内存中,您将不知道它在哪里,因为您不再有指向它的指针。
即使您能以某种方式在没有引用的情况下找到该对象,仍然是更好的代码来明确表示您希望稍后通过设置新引用再次访问它。
当然有一个例外,如您的示例中的常量字符串。这些内置于可执行文件中并且始终可用——它们不会消失。但是如果你没有指针,你仍然无法访问它们。
所以我写了这段代码:
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 是:字符串 2
2015-03-01 17:11:16.601 er[956:32910] str2 是:string 1string 2
所以 str2 现在指向内存中的不同位置。有没有办法访问旧指针 str1 或 arc 立即杀死它?
通常不会,在您将新值分配给对象指针后,旧对象将被释放。如果有其他指向它的指针,它当然会保留在内存中。所以如果你想保留一个对象,请保留指向它的指针。
添加
NSString *oldStr2 = str2;
在重新分配 str2 并保留它之前。否则你无法知道对象是留在内存中还是消失了。如果它留在内存中,您将不知道它在哪里,因为您不再有指向它的指针。
即使您能以某种方式在没有引用的情况下找到该对象,仍然是更好的代码来明确表示您希望稍后通过设置新引用再次访问它。
当然有一个例外,如您的示例中的常量字符串。这些内置于可执行文件中并且始终可用——它们不会消失。但是如果你没有指针,你仍然无法访问它们。