Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 目标C[物体释放]_Iphone_Objective C_Oop_Release_Reference Counting - Fatal编程技术网

Iphone 目标C[物体释放]

Iphone 目标C[物体释放],iphone,objective-c,oop,release,reference-counting,Iphone,Objective C,Oop,Release,Reference Counting,我正在查看其他人的代码,但它似乎发布了对象视频,但随后继续使用它 现在,从我对面向对象编程语言的理解来看,一旦它发布,就应该从内存中释放出来 我看不出它有什么参考资料……但我想这就是它没问题的原因。这似乎是一件很奇怪的事情,(当你还没有完成的时候就发布它,比如为什么不使用自动释放) 这一行实际上调用了-setVideo:方法,其中可能保留了视频变量(如果使用retain属性声明了相应的属性)。所以视频对象的保留计数变为2,为了补偿额外的保留,我们释放它。对象只有在其保留计数变为0时才会解除分配,

我正在查看其他人的代码,但它似乎发布了对象视频,但随后继续使用它

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

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

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

我们还需要在代码中的某个地方发布视频(例如,在dealloc方法中),以确保视频对象在不需要时被销毁,以避免内存泄漏。它相当于:
self.video=[[[VideoFrameExtractor alloc]initWithVideo:[实用程序绑定路径:@“sophie.mov”]]自动释放]

(假设视频由自己保留)

在可能的情况下,通过避免自动释放池,有一个小的性能提升,并且它有助于定位代码中有关引用计数的错误。苏。。。假设属性是retain或copy,那么self应该只包含一个引用-这是完美的


希望这能有所帮助。

为什么不在释放视频对象之前获取宽度和高度?不是我的代码,但似乎因为释放时保留计数为2,所以位置没有区别。
self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];
[video release];

// set output image size
video.outputWidth = 426;
video.outputHeight = 320;
self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];