【问题标题】:Objective C [object release]Objective C [对象发布]
【发布时间】:2011-04-29 00:31:12
【问题描述】:

我正在查看别人的代码,但它似乎释放对象 VIDEO 但随后继续使用它。

现在根据我对面向对象编程语言的理解,一旦发布,它应该从内存中释放...

我看不出它有什么参考资料……但我假设这就是它没问题的原因。做起来好像很奇怪,(还没用完就释放它,比如为什么不使用自动释放)。

self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];
[video release];

// set output image size
video.outputWidth = 426;
video.outputHeight = 320;

【问题讨论】:

  • 为什么不在释放视频对象之前获取宽度和高度?
  • 不是我的代码,但似乎因为发布时保留计数为 2,所以位置没有区别。

标签: iphone objective-c oop release reference-counting


【解决方案1】:

相当于: self.video = [[[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]] autorelease];

(假设视频是自己保留的)

在可能的情况下避免使用自动释放池可以略微提高性能,并且有助于定位代码中与引用计数有关的错误。 soo...假设该属性是保留或复制,那么 self 应该只持有一个引用 - 这是完美的。

希望有帮助。

【讨论】:

    【解决方案2】:
    self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];
    

    这一行实际上调用-setVideo: 方法,其中视频变量可能被保留(如果相应的属性声明为具有保留属性)。因此视频对象的保留计数变为 2,为了补偿额外的保留,我们将其释放。对象仅在其保留计数变为 0 时才被释放,因此这样做是安全的。

    我们还需要在代码中的某处释放视频(例如在 dealloc 方法中),以确保视频对象在不需要时被销毁以避免内存泄漏

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      相关资源
      最近更新 更多