您好我目前在完成块中桥接变量时遇到问题。我想在完成块中将isPreviewPlaying
设置为否,但我无法做到。
static void completionCallback (SystemSoundID mySSID, void *myself) {
AudioServicesRemoveSystemSoundCompletion (mySSID);
AudioServicesDisposeSystemSoundID(mySSID);
CFRelease(myself);
UIButton *previewButton = (__bridge UIButton*)myself;
[previewButton setTitle:@"Preview" forState:UIControlStateNormal];
_isPreviewPlaying = NO // I want to do this, but I can't.
}
- (void)previewButtonPressed:(id)sender {
if (_isPreviewPlaying) {
_isPreviewPlaying = NO;
NSLog(@"STOP");
AudioServicesDisposeSystemSoundID(soundID);
} else {
NSString * selectedPreviewSound = [self.soundFile objectAtIndex: _soundFileIndex];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath: selectedPreviewSound], &soundID);
AudioServicesPlaySystemSound (soundID);
_isPreviewPlaying = YES;
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)sender);
[sender setTitle:@"Stop" forState:UIControlStateNormal];
}
}
答案 0 :(得分:1)
你需要将类实例传递给完成 block 函数,因为它是一个C函数,这样你就可以访问实例上的属性和方法。
我认为这是myself
参数的意图,但是你目前正在使用CFRelease()
发布它的某些原因我无法理解(我假设sender
是一个按钮{ {1}}看起来像一个按钮事件回调,释放它不会做任何好处;阅读崩溃)。
因此我建议:
previewButtonPressed:
来电。CFRelease()
投射到任何类:myself
。MyClass *myclass = (MyClass *)myself;
(假设它是财产)myclass.previewPlaying = NO;
(见下文)。[myclass previewNotPlaying]
代替self
传递给sender
。编辑话虽如此,我现在看到您正在使用按钮实例来显示信息。而不是在上面调用属性,而是调用实例上的方法,并使该方法完成工作:
AudioServicesAddSystemSoundCompletion()