[Objective-C]动态向对象发送消息的两种情况以及对应方法初探

 

情况一:消息的返回类型未非基础数据类型,如NSArray
	NSString * mname = [@"indexPathsF" stringByAppendingString: @"orSelectedRows"];
	SEL selector = NSSelectorFromString(mname);
	NSArray * array = (NSArray *)[tableView performSelector: selector];
	NSLog(@"Selected(Section, Index) = %@", [array objectAtIndex:0]);

情况二:消息返回类型为基础数据类型,如BOOL
需包含头文件 objc/objc-runtime.h
	NSString * mname = [@"showsSelectionImmediatelyOnTouchBegi" stringByAppendingString: @"n"];
SEL selector = NSSelectorFromString(mname); BOOL (*MyMagicSender)(id, SEL) = (BOOL (*)(id, SEL))objc_msgSend; if ([self.tableView respondsToSelector: selector] == YES) { BOOL bRet = MyMagicSender(self.tableView, selector); NSLog(@"bRet = %d", bRet); }

区别:
情况一使用 performSelector 系列消息搞定
情况二通过函数指针搞定
注意:
严谨的做法是,使用 respondsToSelector 进行检查后再动态调用方法。
若第二种情况使用第一种情况的方法,虽然不会报错,但是你会发现 performSelector 返回值一直是 0x0,因此无法取到想要的值。
以上测试的API都是私有API,项目中谨慎使用。
扩展阅读:
http://www.red-sweater.com/blog/320/abusing-objective-c-with-class
关于 performSelector 的基本使用方法参考相关文档

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值