NSStrings之间的差异?

时间:2009-11-23 16:20:24

标签: objective-c cocoa

据我所知,v03示例创建了一个我拥有并最终必须释放的对象。我想知道的是前两个(v_01和v02)之间是否存在差异,或者它们基本相同?

// Version_01
userName = @"Teddy";

// Version_02
userName = [NSString stringWithString:@"Gary"];

// Version_03
userName = [[NSString alloc] initWithString:@"Caroline"];
... some code
[userName release];

加里

5 个答案:

答案 0 :(得分:4)

它们都很相似,但三者之间存在一些细微差别。

第一个是指向字符串常量的指针。字符串Teddy存储在只读存储器中,userName是指向此字符串常量的指针。您不需要(也不能)保留或释放此对象,因为它“永久”存在(即,在程序的持续时间内)。

第二个是自动释放的字符串对象,其内容为Gary。当返回给你时,它的释放次数为0.它可以根据需要保留和释放。

第三个类似于第二个,但它自动释放,因此当它最初返回给你时它的保留计数为1。与第二个一样,它可以根据需要保留和释放。

答案 1 :(得分:1)

这些实例中的大多数差异都是如何管理内存。如果您想更清楚地了解后台发生的情况,可能需要仔细阅读Objective-C Memory Management Guide

// Version_01
userName = @"Teddy";

这是一个String常量,没有任何与之关联的内存管理。用于保存值的内存是代码所在的内存的一部分(基本上)。 <}对此变量的retainrelease调用将被忽略。

// Version_02
userName = [NSString stringWithString:@"Gary"];

这是NSString对象的autoreleased实例。它的保留计数目前是一个,并且很快将被自动释放池释放,除非它被保留。

// Version_03
userName = [[NSString alloc] initWithString:@"Caroline"];
[userName release];

这是NSString的托管实例。首次初始化时,其保留计数为1。释放后,保留计数降至零,因此,其内存将被释放。在发布后引用变量userName会导致EXE_BAD_ACCESS错误。

答案 2 :(得分:0)

前两个或基本相同

然而,后者不是因为userName在那时将是无效的字符串对象。

然而将其改为

userName = [[[NSString alloc] initWithString:@"Caroline"] autorelease];

将有效地与前两个相同。

答案 3 :(得分:0)

版本01:是一个字符串常量.... 版本02:是通过复制常量创建的自动释放的NSString。

答案 4 :(得分:0)

实际上,只要您在释放后不尝试使用Version_03字符串,就没有区别。如果你想这样做,你需要自动发布它。