NSString vs NSMutableString with stringByAppendingString

Jos*_*eph 4 string iphone nsstring uilabel nsmutablestring

所以,我很确定如果我打算经常操作字符串,比如使用stringByAppendingString,我应该使用NSMutableString类型的变量.

但是,如果我做这样的事情怎么办?

UILabel *someLabel = [[UILabel alloc] init];
[someLabel setText: [[someDictionary objectForKey:@"some_key"] stringByAppendingString:@"some other string"];
Run Code Online (Sandbox Code Playgroud)

我读到如果你stringByAppendingString在NSString上使用,你最终会出现泄漏,因为与初始NSString关联的指针移动,指向append创建的新字符串,而使用NSMutableString,指针始终指向可变字符串.

所以我的问题是,当我调用stringByAppendingString一个字符串,但没有显式的NSString NSMutableString 时,隐含发生了什么?比如,在我上面的例子中,字典中某些键的值.这样做是错的,我应该做下面的事情吗?

[[[NSMutableString stringWithString:[someDictionary objectForKey:@"some_key"]] stringByAppendingString:@"some other string"]]
Run Code Online (Sandbox Code Playgroud)

occ*_*lus 5

我读到如果你在NSString上使用stringByAppendingString,你最终会出现泄漏,因为与初始NSString关联的指针移动,指向append创建的新字符串,而使用NSMutableString,指针始终指向可变字符串.

这听起来像是一个没有完全掌握内存管理内容的人的建议.当然,[NSString stringByAppendingString]返回一个新的字符串.但你用新字符串做什么取决于你.你可以通过粗心的方式将结果重新分配给保留的属性,从而导致内存泄漏,如下所示:

myStringProperty = [myStringProperty stringByAppendingString:@" more bits"];
Run Code Online (Sandbox Code Playgroud)

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

self.myStringProperty = [myStringProperty stringByAppendingString:@" more bits"];
Run Code Online (Sandbox Code Playgroud)

遵循可可记忆准则.

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

有趣的说明:Apple选择将NSMutableString作为NSString的子类.关于这一点似乎是不明智的 - 如果某些东西看起来是不可变的,因为它有类型NSString,我希望它是不可变的!(但事实上它可能是NSMutableString.)与Java相比,它有一个String类和一个完全独立的BufferedString类.