我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?

Posted

技术标签:

【中文标题】我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?【英文标题】:Should I call release on an autorelease object assigned to a retained property before reassigning it? 【发布时间】:2013-10-18 01:52:46 【问题描述】:

在这方面仍然没有 %100 明确。当 AVPlayer 连接中断时,可靠地重新启动它的唯一方法是重新创建对象。由于它们是使用便捷方法创建的,因此它们会自动释放,但属性设置器应保留它们。 我应该在重新分配它们之前释放它们吗?当我这样做时,我得到了随机异常。没有发布它不会崩溃,但我很确定那是泄漏???

@interface
@property (retain, nonatomic) AVPlayerItem *streamItem;
@property (retain, nonatomic) AVPlayer *streamPlayer;

@implementation

- (void)restartStream

    //[self.streamItem release]; // ???????
    //[self.streamPlayer release]; // ???????
    self.streamItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://someStream.com"]];
    self.streamPlayer = [AVPlayer playerWithPlayerItem:self.streamItem];

【问题讨论】:

【参考方案1】:

您的 setter 应在分配和保留新值之前释放旧值。请参阅this answer,了解如何实现合成 MRC。如果您没有提供自己的 setter,则不应泄漏内存。

- (void)restartStream

    self.streamItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://someStream.com"]];
    self.streamPlayer = [AVPlayer playerWithPlayerItem:self.streamItem];

【讨论】:

以上是关于我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?的主要内容,如果未能解决你的问题,请参考以下文章

关于在属性中保留属性的问题

重新分配给包含自动释放对象的指针是不是不正确?

如果将弱属性分配给强属性会发生啥?

这个变量应该手动释放吗?

从 Instruments 读取内存分配结果

glGenBuffers - 释放内存?