下面是我的代码:
NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];现在我采用另一个字符串,如下所示。
NSString *x2=[xyz copy];我不知道这里到底会发生什么?是不是像这样,x2有xyz的ref?
NSString *x3=[xyz retain];这里会发生什么,x3有一个新的内存复制了字符串或xyz copy做了吗?
现在,如何从内存中删除所有这三个字符串?
发布于 2010-02-02 18:15:15
NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];这将创建NSString的自动释放实例-当自动释放池被排出时(通常在下一次运行循环中),它将被释放。
NSString *x2 = [xyz copy];理论上,xyz消息将创建一个新的对象实例,保留计数为1(也就是说,您必须在某个地方释放它),但是由于NSString对象是不可变的,因此-copy副本将被优化为xyz retain,因此它将指向相同的实例。
NSString *x3=[xyz retain];x3将指向与xyz (和x2)相同的实例,并且其保留计数将递增-您必须在某个地方释放您的对象。
现在,如何从内存中删除所有这三个字符串?
确保将所有保留(复制)消息与release配对,内存将被释放。
有关更多详细信息,请阅读Objective-c memory management guide。
发布于 2010-02-02 19:33:00
在这种情况下,熟悉objective-c和cocoa (以及相关框架)中与内存管理相关的消息命名约定/规则特别有用:
如果您使用名称以“alloc”或“
”开头或包含“copy”(例如,alloc、newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则您将获得对象的所有权。您有责任使用release或autorelease放弃您拥有的对象的所有权。任何时候你收到一个对象,你都不能释放它。(Memory Management Programming Guide for Cocoa)
因此,您可以假设,您从消息中接收到的每个对象都是自动释放的,或者通过某种其他方式(它可能是由其他对象管理的共享对象等)自动释放。
如果你只需要记住这一点,你的问题就可以很快得到回答:
https://stackoverflow.com/questions/2183175
复制相似问题