我正在尝试将NSString
中的NSMutableArray
值复制到新变量中。 NSString stringWithString
返回NSString
,其内存地址与数组中的对象相同。为什么呢?
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray *arr = [NSMutableArray arrayWithObject:@"first"];
NSLog(@"string is '%@' %p", [arr objectAtIndex:0], [arr objectAtIndex:0]);
// copy the string
NSString *copy = [NSString stringWithString:[arr objectAtIndex:0]];
NSLog(@"string is '%@' %p", copy, copy);
}
return 0;
}
答案 0 :(得分:7)
1)每当您使用@""
语法创建字符串时,框架将自动缓存字符串。 NSString
是一个非常特殊的类,但框架会处理它。当您在应用的多个位置使用@"Some String"
时,它们都将指向内存中的相同地址。只有在使用-initWithData:encoding
之类的内容时,才会缓存字符串。
2)其他答案建议您应该使用-copy
,但-copy
只会在对象可变的情况下创建对象的副本。 (如NSMutableString)
当您将-copy
发送到不可变对象(如NSString)时,它将与发送它-retain
相同,后者返回对象本身。
NSString *originalString = @"Some String";
NSString *copy = [originalString copy];
NSString *mutableCopy1 = [originalString mutableCopy];
NSString *mutableCopy2 = [mutableCopy copy];
NSString *anotherString = [[NSString alloc] initWithString:originalString];
- &GT; originalString
,copy
,mutableCopy2
和anotherString
都会指向相同的内存地址,只有mutableCopy1
个点会占用不同的内存区域。
答案 1 :(得分:4)
由于NSString
实例不可变,+stringWithString:
方法只是返回带有递增引用计数的输入字符串。
如果确实想要强制创建一个新的相同字符串,请尝试:
NSString * copy = [NSString stringWithFormat:@"%@", [arr objectAtIndex:0]];
但这样做没有什么意义,除非你因为某些其他原因需要指针是唯一的...