一个简单的Objective-C内存问题-释放一个属性,不能重新分配和初始化

问题描述

|| 我正在使用AudioStreamer的此分叉来流音频。 在视图控制器中,我将AudioStreamer作为属性
@property (nonatomic,retain) AudioStreamer *streamer
当视图控制器加载时,我开始像这样的流:
self.streamer = [[AudioStreamer alloc] initWithURL:[NSURL URLWithString:preset.url]];
并停止流,释放它并开始新的流,我正在这样做:
[streamer stop];
[streamer release];
self.streamer = nil;
self.streamer = [[AudioStreamer alloc] initWithURL:[NSURL URLWithString:preset.url]];
这不起作用,因为在initWithURL:方法中,有一个检查以查看
if (self != nil)
并且检查失败。 谁能澄清为什么这行不通? 谢谢。 编辑:实际上是我项目中的一些问题导致了奇怪的问题。但是,我将答案标记为正确,因为它有一些不错的记忆技巧,也有帮助。     

解决方法

通过使用点语法设置它并使用alloc,可以保留流媒体实例。 综合的setter将保留一次并第二次分配,您应该添加一个自动释放:
self.streamer = [[[AudioStreamer alloc] initWithURL:[NSURL URLWithString:preset.url]] autorelease];
这行:
self.streamer = [[AudioStreamer alloc] initWithURL:[NSURL URLWithString:preset.url]];
将自动为您释放先前分配的实例。这样您就不必打电话
[streamer release];
self.streamer = nil;
在它之前。 但是你应该做
[streamer release];
在您的dealloc方法中。     ,首先,您无意间双倍地付了8英镑。
[streamer release];     // Releases the ivar,but doesn\'t set it to nil.
self.streamer = nil;    // This is a property access,which releases the old
                        // value (again) before setting to nil.
最后一行中的分配泄漏了一个引用(正在分配,然后分配给
retain
属性)。 您有点混合访问隐喻。如果您拥有该属性,则请仅使用它:
[self.streamer stop];
self.streamer = [[[AudioStreamer alloc] initWithURL:[NSURL URLWithString:preset.url]] autorelease];
综上所述,不一定可以通过“ 12”检查失败来解释,但可能取决于AudioStreamer对其内部对象管理所做的工作。