更改完成块中的变量

时间:2015-10-01 20:15:59

标签: objective-c

您好我目前在完成块中桥接变量时遇到问题。我想在完成块中将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];
 }
}

1 个答案:

答案 0 :(得分:1)

你需要将类实例传递给完成 block 函数,因为它是一个C函数,这样你就可以访问实例上的属性和方法。

我认为这是myself参数的意图,但是你目前正在使用CFRelease()发布它的某些原因我无法理解(我假设sender是一个按钮{ {1}}看起来像一个按钮事件回调,释放它不会做任何好处;阅读崩溃)。

因此我建议:

  1. 删除previewButtonPressed:来电。
  2. CFRelease()投射到任何类:myself
  3. 致电MyClass *myclass = (MyClass *)myself;(假设它是财产)。致电myclass.previewPlaying = NO;(见下文)。
  4. [myclass previewNotPlaying]代替self传递给sender
  5. 编辑话虽如此,我现在看到您正在使用按钮实例来显示信息。而不是在上面调用属性,而是调用实例上的方法,并使该方法完成工作:

    AudioServicesAddSystemSoundCompletion()