gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:10:06 24 4
gpt4 key购买 nike

@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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com