据我所知,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];
加里
答案 0 :(得分:4)
它们都很相似,但三者之间存在一些细微差别。
第一个是指向字符串常量的指针。字符串Teddy
存储在只读存储器中,userName
是指向此字符串常量的指针。您不需要(也不能)保留或释放此对象,因为它“永久”存在(即,在程序的持续时间内)。
第二个是自动释放的字符串对象,其内容为Gary
。当返回给你时,它的释放次数为0.它可以根据需要保留和释放。
第三个类似于第二个,但它不自动释放,因此当它最初返回给你时它的保留计数为1。与第二个一样,它可以根据需要保留和释放。
答案 1 :(得分:1)
这些实例中的大多数差异都是如何管理内存。如果您想更清楚地了解后台发生的情况,可能需要仔细阅读Objective-C Memory Management Guide。
// Version_01
userName = @"Teddy";
这是一个String常量,没有任何与之关联的内存管理。用于保存值的内存是代码所在的内存的一部分(基本上)。 <}对此变量的retain
和release
调用将被忽略。
// 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字符串,就没有区别。如果你想这样做,你需要自动发布它。