在iOS OC编程中,很多场景都会使用回调,尤其和C、C++代码的数据交互上,使用回调,会很方便。那么在OC中都可以使用那些回调方法呢?总结了以下6种:
int (^block)(int,int);
通过typedef简化:
typedef int (^block)(int,int);
block bl = ^(int a,int b){
return a+b;
}
//回调函数定义:
- (int)handleBlockCallbackFunc: (block)callback
{
return callback(10,12);
}
回调函数使用:
int ret = [self handleBlockCallbackFunc:
^(int param,__unused int b) {
NSLog(@"Block Msg: %d", param);
return param*2;
}];
警告:
[target performSelector: @selector(callback)];
方式建立回调,则需要对类的回调消息名建立约定,且回调消息名具有独占性,即一个类中只能以此消息名进行回调。
[target performSelector: sel];
或是外部传入字符串建立回调
[target performSelector:NSSelectorFromString(@"callback")];
使用自动引数编译器特征(ARC)会产生警告“performSelector may cause a leak because its selector is unknown”
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName: NOTIFY_MSG_UC_COMMON_PLAYER_PLAY // 消息名(字符串)
object:self // 消息源
userInfo:nil]; // 用户字典(传递更多自定义参数)
[nc addObserver: self // 观察者
selector: @selector(handleNotify_Play:) // 回调
name: NOTIFY_MSG_UC_COMMON_PLAYER_PLAY // 监听消息
object: nil]; // 消息源
(4).注销消息
[nc removeObserver: self];
(5).回调定义
- (void) handleNotify_Play:(NSNotification *)note;
只有一个参数
NSNotification*
–name // 消息名
–object // 消息源
–userInfo // 用户字典
优点:
typedef int (*CBFUNC)(id, SEL, int, int, int); // 定义函数指针类型
int ret = ((CBFUNC)callback)(self, sel, param1, param2, param3); // 强制转换
这里的id和SEL只是OBJC系统约定的占位,自定义回调时无实际意义
IOS回调方法应用场景总结:
(1).单纯的回调,且没有复用的必要,也无IOS版本限制,可采用block
(2).单纯的回调,有复用要求,可使用performSelector、objc_msgSend,或是IMP的回调机制
(3).使用自动引数的情况下,尽量不使用performSelector回调传入的@Selector,防止警告
(4).对象间有较多的互操作,对象有复用的必要,可采用协议
(5).无指定对象的一对多回调采用NSNotificationCenter
(6).有延迟调用等特殊应用的,可以使用performSelector