我在Xcode中遇到了一些Objective-c问题。我试图改编DiskArbitration框架中的一个例子,而且我遇到了问题。此示例在框架看到磁盘时设置回调。从回调中,我想更新标签。
-(void)diskAppearedCallback:(DADiskRef *)disk context:(void *)context{
CFDictionaryRef description = DADiskCopyDescription(*disk);
NSLog(@"Disk appeared: %@", description);
NSString *spaceLeft = CFDictionaryGetValue(description, CFSTR("DADeviceModel"));
NSLog(@"Disk Name: %@", CFDictionaryGetValue(description, CFSTR("DADeviceModel")));
[labelSpaceLeft setStringValue:[NSString stringWithFormat: @"%@", spaceLeft]];
CFRelease(description);
}
静态函数中的注释行是我尝试过的,但我得到了一个"使用未声明的标识符"错误。
我也尝试将函数转换为编译器可以使用的方法,但后来我不知道如何从顶部的DARegisterDiskAppearedCallback行正确调用它。
{{1}}
**更新:以下是项目的要点:https://gist.github.com/anonymous/cb1c5795536ca15ef4e3
答案 0 :(得分:2)
好的,问题是你基本上混合C和Objective-C。回调函数diskAppearedCallback
是一个C函数,不属于该类,即使它是在@implementation
和@end
之间定义的。因此,它无权访问_labelSpaceLeft
。
要解决此问题,您需要使用回调函数来调用该类实例上的方法,因此在注册回调时,请在最后一个参数中传递实例。这正是回调函数中的上下文指针。
DARegisterDiskAppearedCallback(sessionDA,
kDADiskDescriptionMatchVolumeMountable,
diskAppearedCallback,
self); // HERE
然后回调函数中的context
将是一个指向类实例的指针:
static void diskAppearedCallback(DADiskRef disk, void* context) {
CFDictionaryRef description = DADiskCopyDescription(*disk);
NSLog(@"Disk appeared: %@", description);
NSString *spaceLeft = CFDictionaryGetValue(description, CFSTR("DADeviceModel"));
NSLog(@"Disk Name: %@", CFDictionaryGetValue(description, CFSTR("DADeviceModel")));
// HERE
AVRecorderDocument *instance = (AVRecorderDocument *)context;
[instance.labelSpaceLeft setStringValue:spaceLeft];
CFRelease(description);
}