objective-c – 为什么NSString stringWithString返回指向复制字符串的指针?

我正在尝试将NSMtringArray中的NSString值复制到一个新变量中. 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;
}
最佳答案
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];

– > originalString,copy,mutableCopy2和anotherString都指向相同的内存地址,只有mutableCopy1指向不同的内存区域.

转载注明原文:objective-c – 为什么NSString stringWithString返回指向复制字符串的指针? - 代码日志