问题描述
||
我正在使用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对其内部对象管理所做的工作。