如果您尝试释放已释放的对象会发生什么?

adi*_*dit 1 iphone memory-management objective-c

如果我有一个对象怎么办,比如NSIndexPath,在我复制之前我总是先发布它?

内存数量是否可以低于0?我这样做是为了防止内存泄漏..这是一个好方法吗?

//全球已经在这里之前有一定的价值,或者没有价值.我想更新
//这个新值(我不再关心老指针)

 [global release]
 global = [indexPath copy];
Run Code Online (Sandbox Code Playgroud)

And*_*jão 8

别.当保留计数达到0时,您的对象将被释放并且其指针将变为无效,因此再次使用它将导致不可预测的结果(即崩溃).

您应该阅读Apple的内存管理指南.

这是基本规则:

  • 您只释放或自动释放您拥有的对象.如果使用名称以"alloc","new","copy"或"mutableCopy"(例如,alloc,newObject或mutableCopy)开头的方法创建对象,或者如果发送它,则获取对象的所有权保留消息.
  • 您使用release或autorelease放弃对象的所有权.autorelease只是意味着"将来发送一条释放消息"(具体来说:当使用的自动释放池收到一条消息消息时).

更新:

正如Josh指出的那样,你需要考虑的一个案例是global和indexPath是相同的.在这种情况下,您仍然"需要"指针(执行复制),因此您要么自动释放(而不是释放),要么使用临时变量来处理它.

  • 作为这篇文章的附录,查看retainCount几乎总是错误的做法.所以不要这样做,甚至不用于"调试"目的. (4认同)