因此,我相当肯定,如果我计划经常操作字符串,比如使用stringByAppendingString
,我应该使用NSMutableString类型的变量。
但如果我要做这样的事呢?
UILabel *someLabel = [[UILabel alloc] init];
[someLabel setText: [[someDictionary objectForKey:@"some_key"] stringByAppendingString:@"some other string"];
我读到,如果在stringByAppendingString
上使用NSString,最终会出现泄漏,因为与初始NSString相关联的指针会移动,指向附加程序创建的新字符串,而对于NSMutableString,指针总是指向可更改的字符串。
所以我的问题是,当我对一个字符串调用stringByAppendingString
,但不是显式地调用NSString或NSMutableString时,会发生什么?例如,在上述情况下,字典中某个键的值。是不是做错了,我应该做下面这样的事情吗?
[[[NSMutableString stringWithString:[someDictionary objectForKey:@"some_key"]] stringByAppendingString:@"some other string"]]
发布于 2011-03-04 17:01:03
我一直是[NSString stringWithFormat@"%@%@", a, b];
的粉丝,因为很明显,您会得到一个新的自动释放字符串,并且可以正确地处理"a“和"b”。
使用[someDictionary objectForKey:@"some_key"]
,您将获得最初放入该字典中的对象类型。因此,在不了解字典内容的情况下盲目地调用stringByAppendingString
似乎是个坏主意。
发布于 2011-03-04 17:01:53
我读到,如果在stringByAppendingString上使用NSString,最终会出现泄漏,因为与初始NSString相关联的指针会移动,指向附加程序创建的新字符串,而对于NSMutableString,指针总是指向可更改的字符串。
这听起来像是一个对内存管理不太了解的人的建议。当然,[NSString stringByAppendingString]
返回一个新字符串。但是你用新的绳子做什么取决于你自己。通过不小心地将结果重新分配给保留的属性,肯定会导致内存泄漏,如下所示:
myStringProperty = [myStringProperty stringByAppendingString:@" more bits"];
正确的形式是使用self,如下所示:
self.myStringProperty = [myStringProperty stringByAppendingString:@" more bits"];
遵循可可记忆指南。
至于字典和其他集合类型:根据您所知道的类型,适当地处理字典中的内容。如果你取出一个对象,它实际上是一个NSString,但尝试使用它作为一个NSMutableString,你的应用程序会崩溃(选择器找不到“或类似的)。因此,在这种情况下,您确实需要从NSMutableString中生成一个新的NSString。
有趣的是:苹果选择将NSMutableString作为NSString的子类。在我看来,这是不明智的--如果某些东西看起来是不可变的,因为它有NSString类型,我希望它是不可变的!(但实际上可能是NSMutableString。)将其与具有字符串类和完全独立的BufferedString类的Java进行比较。
发布于 2011-03-04 18:00:10
-stringByAppendingString将返回一个与所涉及的两个字符串不同的新NSString。换言之:
NSString *string3 = [string1 stringByAppendingString:string2];
string3是一个全新的字符串。string1一点也不改变,它的内存位置或内容没有发生任何变化。告诉你的人可能只是误解了发生了什么。
[mutableString1 appendString:string2];
在本例中,mutableString1仍然指向同一个对象,但该对象的内容已更改为包含string2。
要记住的最后一件事是,如果您使用可变字符串,您应该小心地共享对它的引用。如果您将可变字符串传递给某个函数,该函数保存了指向该可变字符串的指针,然后您的代码将在将来的某个点更改该可变字符串,则其他引用将指向完全相同的对象,这意味着其他代码也将看到更改。如果这是你想要的,那就太好了,但如果不是,你必须小心。
避免此问题的一种方法是声明NSStrings的@property语句为“复制”,而不是“保留”。这将在属性中设置可变字符串之前生成可变字符串的副本,并且-copy方法隐式地为您提供一个不可更改的版本,因此它将创建NSMutableString的一个NSString副本。
https://stackoverflow.com/questions/5196705
复制相似问题