NSMutableString vs NSString的用法?
我对NSString
和NSMutable
字符串的使用感到困惑。 假设我有在课堂上宣布这样的实例变量之一,之二:NSMutableString vs NSString的用法?
NSString *one;
NSMutableString *two;
让我们假设我已经创建setter和使用属性他们干将。
可以说,我已经改变了我的“两化”串像这样:
1. [two appendString:@"more string"];
2. two = @"string"
3. self.two = @"string"
问题:
会一号线释放以前的字符串和分配新的对象,并赋值给它。 如果是,那么这是否意味着在这种情况下创建getter和setter是不必要的?或其不必要的创造
NSMutablestring
在这种情况下,性能将以前分配的字符串对象释放?
- 可以肯定的是,第一个对象会被释放,因为我们在这里调用setter。这是必需的代码,或者我们可以使用代码行2来分配字符串。
现在关于NSString
: 如修改字符串这样也:
one = [one stringByAppendingString:@" more string"];
self.one = [one stringByAppendingString:@" more string"];
哪个更好用NSMutablestring
或NSString
?
对不起,很长的文章,但我需要了解这些概念。
对于你的问题的第一部分:
几乎肯定不会。我预计内存将被动态分配,而不是释放和重新分配。
如果以前的答案是否定的,这也是否定的。
第二个和第三个选项甚至不与警告
Incompatible pointer types assigning NSMutableString to NSString
我希望NSMutableString
会在内存方面稍微更有效,因为要表示早在有效的程序可能需要内存动态。 NSString
可能会被分配一个适当大小的内存块。
你的NSMutableString
观点似乎是的NSString的stringBy..
方法将做什么:
随着NSString
及其stringBy...
方法,要创建新的对象,释放旧的(如果需要的话),并使得新对象自动释放。(请注意,如果您正在从非自动释放更改为自动释放,则可能在您的释放中有一个不再需要的版本)
NSMutableString
将存储一些内存为NSString
对象始终为常量。因此,为NSString
变量重新分配新值将为新字符串分配新内存。
但是,请注意代码中的一些错误。你将不得不将消息发送到他们之前初始化的对象:
// this won't work
NSString *one;
[one stringByAppendingString:@"more string"];
// nor this
NSMutableString *two;
[two appendString:@"more string"];
// first do this:
NSString *one = @"an initial string constant"; // or
NSString *one = [NSString string];
NSMutableString *two = [NSMutableString string];
抱歉。但是我跳过那部分代码,因为我的问题涉及到修改字符串,我认为我们可以假设那部分。 – user1374408
NSString
对象是不可改变的,这意味着当你“修改”一个NSString
你实际上创建一个新的字符串,而不是修改旧这是不非常有效。使用NSMutableString
时,字符串保存在可以修改的缓冲区中。
所以简单的规则是,如果您需要以任何方式修改字符串,请使用NSMutableString
,如果不是NSString
。您也可以投一个NSMutableString
到NSString
而不是周围的其他方式(那么你需要做一个副本)
我明白。但我想了解内心的工作和d wanted,只想学习规则而不理解他们的真实应用。反正,谢谢! – user1374408
如果'NSMutableString'可以修改,'NSString'不能,那么为什么你会使用'NSString'? 'NSString'与'NSMutableString'相比有些优势吗? –
的NSString是不可变的字符串对象,这就意味着,在初始化之后,你不能改变它,的NSMutableString是可变的这意味着你可以附加另一个字符串或其他修改。
当你做[two appendString:@"more string"]
时,指针仍然指向内存中的同一位置,你不必担心分配或取消分配。
当你做two = @"string"
时,这意味着你的字符串指针指向内存中的一个特定位置,其中包含内含值“string”的静态字符串。
当你做self.two = @"string"
时,你已经拥有一个名为two的属性了。通过在xcode中使用属性,您不必担心内存,因为您已经在属性声明中指定了内存。这是xcode提供给你的一个很好的工具,你应该尽可能地使用它。
其他词:与ARC你可以使用两个NSString类,不用担心它,但在某些时候,如果更好地节省内存(像动态字符串的动态单元格),你应该使用NSMutableString。 –
的NSMutableString和NSString的之间的不同之处在于:
的NSMutableString:的NSMutableString对象提供方法来修改它们表示字符的基本阵列,而的NSString没有。例如,NSMutableString公开诸如appendString,deleteCharactersInRange,insertString,replaceOccurencesWithString等方法。所有这些方法都对字符串进行操作,因为它在内存中存在。我们可以在运行时更改字符串对象valsue。 NSString:另一方面,如果你愿意的话,只能是一次创建一次然后只读的字符串;你会发现所有的“操作”方法(substring,uppercaseString等)都会返回其他的NSString对象,并且永远不会修改内存中现有的字符串。
的确是一个很好的见解。一个问题:如果我在NSString中使用stringBy方法,并且内存由运行时本身管理,那么是否需要为我的NSString创建属性?在这种情况下创建属性不必要的任务? – user1374408
你打算做什么物业? –
非原子,保留 – user1374408