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)
我读到如果你在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类.
| 归档时间: |
|
| 查看次数: |
3297 次 |
| 最近记录: |