我知道这是与ARC弃用的代码类似的问题但是,我有一些旧的代码来自NIB日,我正在升级到Storyboards,这样做,代码修订导致我一些问题。
在下面的代码中:
- (void)audioSound {
NSString *path = [[NSBundle mainBundle] pathForResource:@"sound-file" ofType:@"mp3"];
if(theAudioSound)[theAudioSound release];
theAudioSound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudioSound.volume = 0.30;
[theAudioSound play];
}
我遇到ARC问题;经过多次尝试寻找解决方案,我只能找到以下建议。
Delete the 'release'
如果我删除了该版本 - 取决于我如何删除它 - 我收到以下错误消息。
这
if(theAudioSound)[theAudioSound release];
到
if(theAudioSound)[theAudioSound];
错误是“预期标识符”
和
if(theAudioSound)[theAudioSound];
到
if(theAudioSound)theAudioSound;
警告是“表达结果未使用”
如果我使用这两个变化中的第二个会有效吗? 如果不;我需要做些什么才能更改代码以使其正常工作?
答案 0 :(得分:0)
// if(theAudioSound)[theAudioSound release];
你需要完全注释掉这一行才能发挥作用。
实际上这是另一种写作方式
if(theAudioSound)
{
[theAudioSound release];
}
如果您只是删除release
,则会产生语法错误。
答案 1 :(得分:0)
“删除'发布'”表示您无需发布它。所以,你只需删除该行或评论。这就是我想的全部。
- (void)audioSound {
NSString *path = [[NSBundle mainBundle] pathForResource:@"sound-file" ofType:@"mp3"];
//if(theAudioSound)[theAudioSound release];
theAudioSound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudioSound.volume = 0.30;
[theAudioSound play];
}
答案 2 :(得分:0)
好吧,如果已经创建了任何对象,release
实际上会释放(减少保留计数)。但是在ARC中,您不必手动release
。
我建议清除AVAudioPlayer
实例而不是release
,它会起作用。所以代码看起来像:
if(theAudioSound) {
theAudioSound = nil;
}
OR
只需删除或注释掉if(theAudioSound)[theAudioSound release];
行,如:
// if(theAudioSound)[theAudioSound release];
继续使用其余代码。希望这会有所帮助。