在Objective C中更改字符串值的正确方法是什么?

时间:2014-06-03 21:42:28

标签: objective-c nsstring

以多种语言更改可变字符串值非常简单:

myString = "foo"
myString = "bar"

然而,在学习Objective C时,您似乎必须真正地,通过箍来改变现有字符串的值(这通常通过切换或如果情况完成):

    NSMutableString *myString;
    myString = [NSMutableString stringWithString:@"foo"];
    myString = [NSMutableString stringWithString:@"bar"];

有没有更好的方法来更改字符串的值?

4 个答案:

答案 0 :(得分:2)

在你的例子中

NSMutableString *myString;
myString = [NSMutableString stringWithString:@"foo"];
myString = [NSMutableString stringWithString:@"bar"];

前两行可以组合在一起,第三行可以简单地减少到更改可变字符串的string属性,就像这样

NSMutableString *myString = [NSMutableString stringWithString:@"foo"];
myString.string = @"bar";

无论如何,只有当你需要传递一个引用并允许它被改变时,可变字符串才有意义。

如果您只是需要随时间更改NSString *指针的值,请执行

NSString *myString = @"foo";
myString = @"bar";
myString = @"baz";

并完成它。

答案 1 :(得分:2)

myString = @"foo"
myString = @"bar"
对象也很好。不要混淆不断变化的对象值(你需要NSMutableString)和变量值。

EDIT。好吧,也许你真的需要改变现有的对象价值,但你的问题并不清楚。您通常不需要改变switch es。

的现有对象

答案 2 :(得分:1)

Objective-C并没有强迫你跳过相对于大多数语言的任何额外的箍。可能根本不太清楚你在其他语言中做了什么,因为在大多数情况下,它都是一样的。

对于初学者来说,Objective-C不允许堆栈上的对象 - 仅在堆上。对于所有对象都是如此,这里的字符串没什么特别之处。其他语言(如C ++)允许堆栈中的对象。

当我们在堆上创建对象时,我们的变量只是指向该对象的指针,所以当我们创建一个对象时,我们必须为它分配内存。

当我们通过=运算符分配字符串对象时,我们也改变了变量所指向的内存位置。

您可以像这样简单地创建字符串:

NSString *fooString = @"foo";
NSString *barString = @"bar";

除了我所见过的任何语言之外,它还没有任何复杂性。它只是一个额外的@,这有多复杂?

但是,更改字符串的值并非如此简单。 NSString是不可变的,所以要改变它的值,我们必须在堆上创建一个新对象,然后指向它。我们没有改变价值,我们创造了一个新的对象,并指出了这一点。

但是,对于NSMutableString,有一系列可用的方法可以更改我们指向的内存位置的实际值。

答案 3 :(得分:1)

这取决于你是否坚持使用字符串来改变其中的字节或者只想完全替换它。替换整个东西不需要'可变'但是如果你想替换它能够修改字节,那么你需要类似的东西:

NSMutableArray *mstr = [@"foo" mutableCopy];
mstr = [@"bar" mutableCopy];