代码之家  ›  专栏  ›  技术社区  ›  David van Dugteren

目标C[目标释放]

  •  2
  • David van Dugteren  · 技术社区  · 14 年前

    我在看别人的代码,但它似乎释放了对象视频,然后继续使用它。

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

    我看不出它有什么参考资料……但我想这就是它正常的原因。似乎做起来很奇怪,(当你还没有完成的时候就释放它,比如为什么不使用autorelease)。

    self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];
    [video release];
    
    // set output image size
    video.outputWidth = 426;
    video.outputHeight = 320;
    
    2 回复  |  直到 12 年前
        1
  •  5
  •   justin    14 年前

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

    (假设视频由自己保留)

    在可能的情况下,通过避免自动释放池来提高性能,并且它有助于在代码中定位有关引用计数的错误。苏…假设属性是保留或复制的,那么self应该只保存一个引用——这是完美的。

    希望有帮助。

        2
  •  4
  •   Vladimir    14 年前
    self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];
    

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

    我们还需要在代码中的某个地方发布视频(例如,在dealoc方法中),以确保视频对象在不需要避免内存泄漏时被销毁。