首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSString与NSMutableString与stringByAppendingString

NSString与NSMutableString与stringByAppendingString
EN

Stack Overflow用户
提问于 2011-03-04 16:46:39
回答 4查看 3.4K关注 0票数 4

因此,我相当肯定,如果我计划经常操作字符串,比如使用stringByAppendingString,我应该使用NSMutableString类型的变量。

但如果我要做这样的事呢?

代码语言:javascript
运行
复制
UILabel *someLabel = [[UILabel alloc] init];
[someLabel setText: [[someDictionary objectForKey:@"some_key"] stringByAppendingString:@"some other string"];

我读到,如果在stringByAppendingString上使用NSString,最终会出现泄漏,因为与初始NSString相关联的指针会移动,指向附加程序创建的新字符串,而对于NSMutableString,指针总是指向可更改的字符串。

所以我的问题是,当我对一个字符串调用stringByAppendingString,但不是显式地调用NSString或NSMutableString时,会发生什么?例如,在上述情况下,字典中某个键的值。是不是做错了,我应该做下面这样的事情吗?

代码语言:javascript
运行
复制
[[[NSMutableString stringWithString:[someDictionary objectForKey:@"some_key"]] stringByAppendingString:@"some other string"]]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-04 17:01:03

我一直是[NSString stringWithFormat@"%@%@", a, b];的粉丝,因为很明显,您会得到一个新的自动释放字符串,并且可以正确地处理"a“和"b”。

使用[someDictionary objectForKey:@"some_key"],您将获得最初放入该字典中的对象类型。因此,在不了解字典内容的情况下盲目地调用stringByAppendingString似乎是个坏主意。

票数 3
EN

Stack Overflow用户

发布于 2011-03-04 17:01:53

我读到,如果在stringByAppendingString上使用NSString,最终会出现泄漏,因为与初始NSString相关联的指针会移动,指向附加程序创建的新字符串,而对于NSMutableString,指针总是指向可更改的字符串。

这听起来像是一个对内存管理不太了解的人的建议。当然,[NSString stringByAppendingString]返回一个新字符串。但是你用新的绳子做什么取决于你自己。通过不小心地将结果重新分配给保留的属性,肯定会导致内存泄漏,如下所示:

代码语言:javascript
运行
复制
myStringProperty = [myStringProperty stringByAppendingString:@" more bits"];

正确的形式是使用self,如下所示:

代码语言:javascript
运行
复制
self.myStringProperty = [myStringProperty stringByAppendingString:@" more bits"];

遵循可可记忆指南。

至于字典和其他集合类型:根据您所知道的类型,适当地处理字典中的内容。如果你取出一个对象,它实际上是一个NSString,但尝试使用它作为一个NSMutableString,你的应用程序会崩溃(选择器找不到“或类似的)。因此,在这种情况下,您确实需要从NSMutableString中生成一个新的NSString。

有趣的是:苹果选择将NSMutableString作为NSString的子类。在我看来,这是不明智的--如果某些东西看起来是不可变的,因为它有NSString类型,我希望它是不可变的!(但实际上可能是NSMutableString。)将其与具有字符串类和完全独立的BufferedString类的Java进行比较。

票数 5
EN

Stack Overflow用户

发布于 2011-03-04 18:00:10

-stringByAppendingString将返回一个与所涉及的两个字符串不同的新NSString。换言之:

代码语言:javascript
运行
复制
NSString *string3 = [string1 stringByAppendingString:string2];

string3是一个全新的字符串。string1一点也不改变,它的内存位置或内容没有发生任何变化。告诉你的人可能只是误解了发生了什么。

代码语言:javascript
运行
复制
[mutableString1 appendString:string2];

在本例中,mutableString1仍然指向同一个对象,但该对象的内容已更改为包含string2。

要记住的最后一件事是,如果您使用可变字符串,您应该小心地共享对它的引用。如果您将可变字符串传递给某个函数,该函数保存了指向该可变字符串的指针,然后您的代码将在将来的某个点更改该可变字符串,则其他引用将指向完全相同的对象,这意味着其他代码也将看到更改。如果这是你想要的,那就太好了,但如果不是,你必须小心。

避免此问题的一种方法是声明NSStrings的@property语句为“复制”,而不是“保留”。这将在属性中设置可变字符串之前生成可变字符串的副本,并且-copy方法隐式地为您提供一个不可更改的版本,因此它将创建NSMutableString的一个NSString副本。

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

https://stackoverflow.com/questions/5196705

复制
相关文章

相似问题

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