首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSStrings之间的区别?

NSStrings之间的区别?
EN

Stack Overflow用户
提问于 2009-11-24 00:20:24
回答 5查看 180关注 0票数 0

我知道v03示例创建了一个我拥有并最终必须释放的对象。我想知道的是,前两者(v_01和v02)之间有什么不同,或者它们本质上是相同的吗?

代码语言:javascript
运行
复制
// Version_01
userName = @"Teddy";

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

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

加里

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-24 00:30:01

这些实例中的大部分差异在于内存的管理方式。如果您想更清楚地了解后台发生了什么,您可能需要仔细阅读Objective-C Memory Management Guide

代码语言:javascript
运行
复制
// Version_01
userName = @"Teddy";

这是一个字符串常量,它没有任何与之相关的内存管理。用于保存该值的内存是代码(本质上)所在的内存的一部分。对该变量的retainrelease调用将被忽略。

代码语言:javascript
运行
复制
// Version_02
userName = [NSString stringWithString:@"Gary"];

这是NSString对象的autoreleased实例。它的保留计数当前是1,除非它被保留,否则将很快被自动释放池释放。

代码语言:javascript
运行
复制
// Version_03
userName = [[NSString alloc] initWithString:@"Caroline"];
[userName release];

这是NSString的托管实例。当它第一次初始化时,它的保留计数是1。在释放它之后,保留计数下降到零,因此,它的内存将被释放。在释放变量userName之后引用它会导致EXE_BAD_ACCESS错误。

票数 1
EN

Stack Overflow用户

发布于 2009-11-24 00:26:23

它们都是相似的,但三者之间有一些细微的区别。

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

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

第三个类似于第二个,但它不是自动释放的,所以在最初返回给您时,它的保留计数为1。像第二个一样,它可以根据需要保留和发布。

票数 4
EN

Stack Overflow用户

发布于 2009-11-24 00:22:46

前两个或本质上相同

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

但是,将其更改为

代码语言:javascript
运行
复制
userName = [[[NSString alloc] initWithString:@"Caroline"] autorelease];

将使它实际上与前两个相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1784222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档