我知道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];加里
发布于 2009-11-24 00:30:01
这些实例中的大部分差异在于内存的管理方式。如果您想更清楚地了解后台发生了什么,您可能需要仔细阅读Objective-C Memory Management Guide。
// Version_01
userName = @"Teddy";这是一个字符串常量,它没有任何与之相关的内存管理。用于保存该值的内存是代码(本质上)所在的内存的一部分。对该变量的retain和release调用将被忽略。
// Version_02
userName = [NSString stringWithString:@"Gary"];这是NSString对象的autoreleased实例。它的保留计数当前是1,除非它被保留,否则将很快被自动释放池释放。
// Version_03
userName = [[NSString alloc] initWithString:@"Caroline"];
[userName release];这是NSString的托管实例。当它第一次初始化时,它的保留计数是1。在释放它之后,保留计数下降到零,因此,它的内存将被释放。在释放变量userName之后引用它会导致EXE_BAD_ACCESS错误。
发布于 2009-11-24 00:26:23
它们都是相似的,但三者之间有一些细微的区别。
第一个是指向字符串常量的指针。字符串Teddy存储在只读内存中,userName是指向此字符串常量的指针。您不需要(也不能)保留或释放此对象,因为它“永久”存在(即,在程序的持续时间内)。
第二个是内容为Gary的自动释放字符串对象。当返回给您时,它的释放计数为0。它可以根据需要保留和发布。
第三个类似于第二个,但它不是自动释放的,所以在最初返回给您时,它的保留计数为1。像第二个一样,它可以根据需要保留和发布。
发布于 2009-11-24 00:22:46
前两个或本质上相同
然而,后者不是,因为userName在那时是一个无效的字符串对象。
但是,将其更改为
userName = [[[NSString alloc] initWithString:@"Caroline"] autorelease];将使它实际上与前两个相同。
https://stackoverflow.com/questions/1784222
复制相似问题