首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSString基础知识-内存-保留-复制

NSString基础知识-内存-保留-复制
EN

Stack Overflow用户
提问于 2010-02-02 18:05:20
回答 2查看 926关注 0票数 2

下面是我的代码:

代码语言:javascript
运行
复制
NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

现在我采用另一个字符串,如下所示。

代码语言:javascript
运行
复制
NSString *x2=[xyz copy];

我不知道这里到底会发生什么?是不是像这样,x2有xyz的ref?

代码语言:javascript
运行
复制
NSString *x3=[xyz retain];

这里会发生什么,x3有一个新的内存复制了字符串或xyz copy做了吗?

现在,如何从内存中删除所有这三个字符串?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-02 18:15:15

代码语言:javascript
运行
复制
NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

这将创建NSString的自动释放实例-当自动释放池被排出时(通常在下一次运行循环中),它将被释放。

代码语言:javascript
运行
复制
NSString *x2 = [xyz copy];

理论上,xyz消息将创建一个新的对象实例,保留计数为1(也就是说,您必须在某个地方释放它),但是由于NSString对象是不可变的,因此-copy副本将被优化为xyz retain,因此它将指向相同的实例。

代码语言:javascript
运行
复制
NSString *x3=[xyz retain];

x3将指向与xyz (和x2)相同的实例,并且其保留计数将递增-您必须在某个地方释放您的对象。

现在,如何从内存中删除所有这三个字符串?

确保将所有保留(复制)消息与release配对,内存将被释放。

有关更多详细信息,请阅读Objective-c memory management guide

票数 6
EN

Stack Overflow用户

发布于 2010-02-02 19:33:00

在这种情况下,熟悉objective-c和cocoa (以及相关框架)中与内存管理相关的消息命名约定/规则特别有用:

如果您使用名称以“alloc”或“

”开头或包含“copy”(例如,alloc、newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则您将获得对象的所有权。您有责任使用release或autorelease放弃您拥有的对象的所有权。任何时候你收到一个对象,你都不能释放它。(Memory Management Programming Guide for Cocoa)

因此,您可以假设,您从消息中接收到的每个对象都是自动释放的,或者通过某种其他方式(它可能是由其他对象管理的共享对象等)自动释放。

如果你只需要记住这一点,你的问题就可以很快得到回答:

  1. 您从名称与上述规则中描述的方案不匹配的消息接收NSString *xyz (不分配、不新建、不复制、不保留)。您不能释放它。
  2. 您从名为copy的消息中收到NSString *x2。当您从名为
  3. 的消息中收到NSString *x3时,必须将其释放。你必须释放它。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2183175

复制
相关文章

相似问题

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