我目前有一些代码如下:
static void callback(several parameters)
{
...
}
@implementation SomeClass
- (id) init
{
self = [super init];
if (self)
{
id ct = CTTelephonyCenterGetDefault();
CTTelephonyCenterAddObserver((__bridge CFNotificationCenterRef)(ct), NULL, callback, NULL, NULL, CFNotificationSuspensionBehaviorHold);
....
在回调函数的主体中,我想更新一些值,我宁愿将它们添加为SomeClass的属性而不是全局变量。 那么是否可以使回调函数成为SomeClass的成员函数?
答案 0 :(得分:3)
如果你正在使用一个接受回调的C API而你想要调用你的一个类的实例方法,你必须使用C函数作为蹦床。与回调函数一起,大多数此类C API允许您指定作为回调参数传回的用户值。您应该将实例指针作为该用户值传递。然后,你的蹦床只会在对象上调用一个实例方法。
例如:
static void callback(void* userValue, /* other parameters... */)
{
MyClass* myObject = (__bridge MyClass*)userValue;
[myObject myMethod:/* other parameters passed along */];
}
您必须弄清楚CTTelephonyCenterAddObserver()
是否可以使用这样的用户值参数以及它是什么。
如果在callback()
内部或外部声明@implementation
,则无关紧要。
答案 1 :(得分:1)
因此可以使回调函数成为其成员函数 SomeClass的
不是真的。方法需要对象进行操作。您通常可以做的事情,取决于您使用的API,是存储指向SomeClass实例的指针,并将其作为addObserver函数的附加参数传递。
假设您对CTTelephonyCenterAddObserver的调用中的一个NULL参数应该是回调例程的附加上下文。将指针传递给CTTelephonyCenterAddObserver时,可以将指向对象的指针转换为(void *)指针,然后将其转换回回调函数内的(SomeClass *)。
答案 2 :(得分:-1)
<强>更新强>
请参阅下面的评论。我的答案不应该是公认的答案。
将callback
移到@implementation
内,如下所示:
@implementation
- (void)callback:(SomeType)parameter1 parameter2:(SomeOtherType)parameter2 {
// do stuff
}
...
@end
如果您希望自己的方法公开,则需要将其添加到界面中:
@interface
- (void)callback:(SomeType)parameter1 parameter2:(SomeOtherType)parameter2;
@end
Apple's Objective-C intro可能会有所帮助。