首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NSString stringWithString返回指向复制字符串的指针?

为什么NSString stringWithString返回指向复制字符串的指针?
EN

Stack Overflow用户
提问于 2012-08-10 03:44:16
回答 2查看 1.8K关注 0票数 4

我正在尝试将NSMutableArray中的NSString值复制到一个新变量中。NSString stringWithString返回一个与我的数组中的对象具有相同内存地址的NSString。为什么?

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-10 03:57:14

1)每当您使用@""语法创建字符串时,框架都会自动缓存该字符串。NSString是一个非常特殊的类,但框架会处理它。当你在应用程序的多个地方使用@"Some String"时,它们都会指向内存中的同一地址。只有当你使用像-initWithData:encoding这样的东西时,字符串才不会被缓存。

2)其他答案建议您应该使用-copy,但-copy只会在对象是可变的情况下创建对象的副本。(如NSMutableString)

当您将-copy发送到不可变对象(如NSString)时,它将与发送返回对象本身的-retain相同。

代码语言:javascript
复制
NSString *originalString = @"Some String";
NSString *copy = [originalString copy];
NSString *mutableCopy1 = [originalString mutableCopy];
NSString *mutableCopy2 = [mutableCopy copy];
NSString *anotherString = [[NSString alloc] initWithString:originalString];

--> originalStringcopymutableCopy2anotherString都指向相同的内存地址,只有mutableCopy1点指向不同的内存区域。

票数 7
EN

Stack Overflow用户

发布于 2012-08-10 03:49:21

因为NSString实例不是可变的,所以+stringWithString:方法只是返回带有递增引用计数的输入字符串。

如果您确实想强制创建一个新的、相同的字符串,请尝试:

代码语言:javascript
复制
NSString * copy = [NSString stringWithFormat:@"%@", [arr objectAtIndex:0]];

不过,这样做几乎没有什么意义,除非您出于其他原因需要指针是唯一的……

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11890814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档