2

我正在查看其他人的代码,但它似乎是 RELEASE 对象 VIDEO 但随后继续使用它。

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

我看不出它有什么参考资料……但我假设这就是它没问题的原因。似乎是一件奇怪的事情,(当你没有完成它时释放它,例如为什么不使用自动释放)。

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

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

2 回答 2

5

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

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

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

希望有帮助。

于 2010-10-22T07:14:28.450 回答
4
self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];

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

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

于 2010-10-22T07:13:38.823 回答