objective-c - 在 Objective C 中,什么相当于在 C 中传递函数指针?

标签 objective-c function-pointers

@implementation ThisObject

-(void)start {

       SomeOtherObject *someOtherObject = [SomeOtherObject alloc];

       [someOtherObject doSomethingAndCallThisFunctionWhenUrDone:myCallBackFunction :self];

}

-(void)myCallBackFunction {

       // :)

}

基本上,我怎样才能让它发挥作用?

最佳答案

回调有四种方式:

  1. 函数指针 如果你真的想做一个函数指针也可以,但不推荐。它的实现方式与在 C 中的实现方式相同。问题是您不能使用指向 Objective-C 方法的函数指针。它看起来像这样:

    void callback(/* Some args */) {
        // Some callback.
    }
    
    - (void)doSomethingAndCallThisFunctionWhenDone:(void(*)(/* Some args */))func {
    
        // Do something.
    
        if (func)
            func(/* Some args */);
    }
    
    - (void)start {
        [self doSomethingAndCallThisFunctionWhenDone:&callback];
    }
    
  2. 选择器 您可以使用 -performSelector:。它看起来像这样:

    - (void)doSomethingAndCallTarget:(id)target withSelector:(SEL)sel {
    
        // Do something.
    
        [target performSelector:sel];
    }
    
    - (void)start {
    
        SomeOtherObject * someOtherObject = [[SomeOtherObject alloc] init];
    
        [self doSomethingAndCallTarget:someOtherObject withSelector:@selector(MyCallback)];
    }
    
  3. 委托(delegate) 使用委托(delegate)。这类似于 UITableViewDelegate/UITableViewDataSource。查看Apple docs here .你可以这样做:

    - (void)doSomethingDelegate:(id<MyCallbackObject>)delegate {
    
        [delegate retain];
    
        // Do something.
    
        [delegate performMyCallback];  // -performMyCallback must be declared in the MyCallbackObject protocol and implemented by SomeOtherObject.
    
        [delegate release];
    }
    
    - (void)start {
    
        id<MyCallbackObject> someOtherObject = [[SomeOtherObject alloc] init];
    
        [self doSomethingDelegate:someOtherObject];
    
        [someOtherObject release];
    }
    
  4. block 回调的首选方式是使用 block 。它们仅适用于 iOS 4.0+ 或 Mac OS X 10.6+。它看起来像这样:

    - (void)doSomethingAndCallThisBlockWhenDone:(void(^)(/* Some args */))block {
    
        [block copy];
    
        // Do something.
    
        if (block)
            block(/* Some args */);
    
        [block release];
    }
    
    - (void)start {
        [self doSomethingAndCallThisBlockWhenDone:^void(/* Some args */){   // Return type and arguments may be omitted if you don't have any.
            // Your callback
        }];
    }
    

正如您在 block 中看到的那样,它更易于阅读,并且您的回调与您的代码内联。这特别好,所以你不必去追捕它。积木还有很多好处,但我不可能在这里一一列举。

最后一件事,如果你使用 block ,你会想要使用 typedef 这样你就不必键入像 void(^)(/* Some args */) 始终。 typedef 可能如下所示:

typdef void(^MyCallback)(/* Some args */);

然后,您可以像这样声明您的方法:

- (void)doSomethingAndCallThisBlockWhenDone:(MyCallback)block;

更新:

我已经展示了如何实现不同技术的更多细节(见上文)。

关于objective-c - 在 Objective C 中,什么相当于在 C 中传递函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6970911/

相关文章:

c# - 将委托(delegate)定义为函数指针

C++ 指向函数的静态成员指针——如何初始化它?

ios - Storyboard,segues,settext 不工作

objective-c - 无法在设备上运行代码

ios - 自定义 segue 到不同的 Storyboard

objective-c - cocoa 全局捷径?

c++ - 如何正确传递带有函数指针的数组?

c++ - 从 a_func(A a_in) 转换为 b_func(B b_in) 的函数 (c++)

c - 那么函数指针的*可以省略吗?

iphone - 使用核心数据的默认排序