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

时间:2010-02-02 10:05:20

标签: iphone objective-c memory-management nsstring

这是我的代码:

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

现在我正在使用其他字符串,如下所示。

NSString *x2=[xyz copy];

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

NSString *x3=[xyz retain];

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

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

2 个答案:

答案 0 :(得分:6)

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

这将创建自动释放的NSString实例 - 它将在自动释放池耗尽时释放(通常在下一个运行循环中)。

NSString *x2 = [xyz copy];

理论上-copy消息将创建一个具有保留计数1的对象的新实例(即必须在某处释放它),但由于NSString对象是不可变的,因此[xyz copy]将优化为[xyz]保留]因此它将指向同一个实例。

NSString *x3=[xyz retain];

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

  

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

确保将所有保留(复制)消息与释放和内存配对将被释放 请阅读Objective-c memory management guide了解详情。

答案 1 :(得分:3)

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

  

如果您拥有对象的所有权   使用名称为的方法创建它   以“alloc”或“new”开头   包含“复制”(例如,alloc,   newObject,或mutableCopy),或者如果你   发送一条保留信息。你是   负责放弃   您拥有的对象的所有权   释放或自动释放。任何其他时间   你收到一个物品,你绝对不能   释放它。 (Memory Management Programming Guide for Cocoa

因此,您可以假设,您从根据上述方案未命名的消息中收到的每个对象都是自动释放或通过其他方式处理(它可能是由以下方式管理的共享对象)其他一些对象等。)

如果您记住这一点,可以快速回答您的问题:

  1. 您从一条消息中收到NSString * xyz,该消息的名称与上述规则中描述的方案不匹配(不是alloc,不是new,不是copy,不是retain)。你一定不能释放它。

  2. 您从名为copy的邮件中收到NSString * x2。你必须释放它

  3. 您从名为retain的邮件中收到NSString * x3。您必须发布它。