一个类是否有可能拥有成员函数?

时间:2016-03-30 19:58:54

标签: objective-c

我目前有一些代码如下:

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的成员函数?

3 个答案:

答案 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可能会有所帮助。