【问题标题】:How to release instance vars and then reuse them如何释放实例变量然后重用它们
【发布时间】:2011-08-28 21:47:18
【问题描述】:

我的应用中有一个对象被声明为实例变量。

URLRequest * myRequest

当我去使用这个类时,我:

myRequest = [[URLRequest alloc] init];

然后当我完成它时,我:

[myRequest release];//or dealloc does the same

这里是更多代码:https://gist.github.com/1177739 过去的事情太多了。

但是,当我再次使用该类时,它会通过 alloc 和 init,但我的应用程序崩溃了。

被释放的指针未被分配

我不明白这一点,因为我再次分配和初始化。如果我不释放,我的应用程序会出现内存泄漏。谢谢

【问题讨论】:

  • 这些方法是什么 - 让我们看看要重现的最少代码 - 在获得最低限度时,您很可能自己就能看到问题
  • 我必须对您的评论发表评论。除非子类化 dealloc 方法并调用 [super dealloc],否则您永远不会调用 dealloc。绝不。曾经。不,它与释放不同,释放减少对象的retainCount,而dealloc在retainCount达到0时(自动)销毁它。关于你的问题,请告诉我们更多,你在哪里分配和释放这个?
  • @Luke:设置一个指向nil的指针意味着你不能再向该对象发送消息;这意味着您无法释放它,并且您有泄漏。有时会设置一个指向nilnil 的指针释放后,以确保您不会意外地向已释放对象发送消息。
  • @Mike007:我怀疑很多人会去 GitHub 阅读所有代码。请在您的问题中发布相关部分。只需编辑问题并复制并粘贴相关代码即可。

标签: iphone objective-c ios macos


【解决方案1】:

也许你的方法

- (void)urlComplete:(NSNotification *)notification

被调用了两次,设置 urlRequest 为 bill 然后在你的开头测试它不是 nil

- (void)urlComplete:(NSNotification *)notification

方法

【讨论】:

  • 我调用了两次这就是问题所在。我按下按钮一次发出请求,我的调用被实例化并发出请求。之后,课程被释放。然后我再次点击一个按钮再次发出请求,它错误地说我的类,“指针被释放没有分配”。我不明白,因为你可以在我的 getExtIP 中看到,我:urlRequest = [[CMURLRequest alloc] init];再做一次。但是下次我调用 urlRquest 时,它崩溃了。
  • 这就是你的问题,你试图释放 urlRequest 两次,当你释放它时将它设置为 nil 然后你可以使用它来测试该方法是否需要再次执行,或者只是让发送一个给 nil 的消息是没有问题的。
  • 谢谢内森,这行得通。一切正常,现在没有内存泄漏。
猜你喜欢
  • 2016-02-13
  • 2011-05-03
  • 1970-01-01
  • 2012-03-16
  • 2012-05-07
  • 2014-03-06
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多