声明一个新的String对象时,是否有必要先实例化它?

时间:2011-04-04 12:17:59

标签: objective-c init alloc

是否有必要对新字符串对象进行实例化,如下面的代码所示:

NSString *newText = [[NSString alloc] initWithFormat:@"%@",sender.titleLabel.text];

或者我们可以简单地运行以下代码:

NSString *newText = sender.titleLabel.text;

我相信会返回相同的结果。那么我们何时知道是否需要“alloc”和“init”以及何时不需要?

由于

2 个答案:

答案 0 :(得分:4)

您只需使用作业(newText = sender.titleLabel.text;)。

你的两个例子的结果不一样,BTW:在你的第一个例子中你创建了一个新对象,在第二个例子中你重用了一个现有的对象。在第一个示例中,您需要稍后调用[newText release];(或自动释放),在您的第二个示例中,您可能不会。

如果您打算将字符串存储在实例变量中,则应将其复制(myInstanceVariable = [sender.titleLabel.text copy];)。原因是因为可能是NSMutableString的一个实例,它可以改变并因此产生意外行为。

答案 1 :(得分:2)

使用时:

NSString *newText = sender.titleLabel.text;

您只是在sender.titleLabel.text上设置指向现有对象的指针。您告诉编译器这个新指针指向NSString类型的对象。

注意:指针newText和sender.titleLabel.txt现在都指向同一个对象,因此当您访问对象时,对底层对象所做的更改(例如更改文本)将会反映出来使用任何一个指针。

注2:使用时:

NSString *newText = [[NSString alloc] initWithFormat:@"%@",sender.titleLabel.text];

您创建了一个全新的对象(通过使用alloc),然后在执行alloc操作时使用字符串值 sender.titleLabel.text 初始化此新对象。现在 newText sender.titleLabel.text 是两个完全不同的NSString对象,它们之间无论如何都不相关,可以完全更改/管理/使用/解除dealloc'd彼此独立。