@implementation ThisObject
-(void)start {
SomeOtherObject *someOtherObject = [SomeOtherObject alloc];
[someOtherObject doSomethingAndCallThisFunctionWhenUrDone:myCallBackFunction :self];
}
-(void)myCallBackFunction {
// :)
}
基本上,我怎样才能让它发挥作用?
最佳答案
回调有四种方式:
函数指针 如果你真的想做一个函数指针也可以,但不推荐。它的实现方式与在 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]; }
选择器 您可以使用 -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)]; }
委托(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]; }
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/