第16月第8天 NSInvocation存储 函数指针 va_arg lldb
1.NSInvocation存储
-(void)setInvok:(id)target sel:(SEL)sel key:(id)key
{
if(!target) return;
NSMethodSignature *sig=[target methodSignatureForSelector:sel];
NSInvocation *invo=[NSInvocation invocationWithMethodSignature:sig];
[invo setTarget:target];
[invo setSelector:sel]; NSDictionary *dict = [self currentStyleDict];
[dict setValue:invo forKey:key];//以key的形式保存invo
} -(NSInvocation*)selectInvok:(NSString *)key style:(PALiveStyle)style
{
NSDictionary *dict = [self getStyleDict:style];
return [dict valueForKey:key];
}
http://blog.sina.com.cn/s/blog_4beb28f30100qask.html
2.函数指针
//常规写法
switch ( oper ){
case ADD:
result = add( oper1, oper2 );
break;
case SUB:
result = sub( oper1, oper2 );
break;
case MUL:
result = mul( oper1, oper2 );
break;
case DIV:
result = div( oper1, oper2 );
break;
...
}
//使用转移表之后的写法
double add( double, double );
double sub( double, double );
double mul( double, double );
double div( double, double );
...
double (*oper_func[])( double, double ) = {
add, sub, mul, div, ...
};
//下面的语句替换前面整条switch语句
result = oper_func[ oper ]( op1, op2 );
https://segmentfault.com/a/1190000000578532
3.runtime
http://justsee.iteye.com/blog/2163777
4.调用是arg后记得传nil
- (bool)startPlayingStream:(NSString *)streamID inView:(UIView*)view
{
// NSInvocation *invo=[[MessageInvok shareInvok] selectInvok:@"start_playing_stream" style:PALiveStyleNormal];
// if(invo)
// {
//// [data retain];
// [invo setArgument:&streamID atIndex:2]; //设置参数
// [invo setArgument:&view atIndex:3]; //设置参数
// [invo invoke]; //调用
// }
// [self invokeMethod:@"start_playing_stream" style:PALiveStyleNormal,streamID,view];
[self invokeMethod:@"start_playing_stream" style:PALiveStyleNormal arg:streamID,view, nil]; return true;
} - (bool)stopPlayingStream:(NSString *)streamID
{ return true;
} -(NSInvocation *)invokeMethod:(NSString *)method style:(PALiveStyle)style arg:(id)arg, ...
{
NSMutableArray *arrayList = [NSMutableArray array]; id eachItem;
va_list argumentList;
if (arg)
{
[arrayList addObject: arg];
va_start(argumentList, arg);
while((eachItem = va_arg(argumentList, id)))
{
[arrayList addObject: eachItem];
}
va_end(argumentList);
} NSInvocation *invo=[[MessageInvok shareInvok] selectInvok:@"start_playing_stream" style:style];
if(invo)
{
for (NSUInteger i =; i<arrayList.count; i++) {
NSInteger idx = i+;
id data = arrayList[i];
[invo setArgument:&data atIndex:idx];
} [invo invoke]; //调用
} return invo;
}
5.lldb e
e aView.backgroundColor = [UIColor greenColor];
http://yulingtianxia.com/blog/2015/11/13/Summary-of-the-first-month-in-the-internship-of-Tencent/
https://github.com/opensource-apple/objc4/blob/master/runtime/Messengers.subproj/objc-msg-x86_64.s
第16月第8天 NSInvocation存储 函数指针 va_arg lldb的更多相关文章
- MySQL学习笔记九:存储过程,存储函数,触发器
存储过程 1.存储过程由一组特定功能的SQL语句组成,对于大型应用程序优势较大,相对不使用存储过程,具有以下优点: a.性能提高,因为存储过程是预编译的,只需编译一次,以后调用就不须再编译 b.重用性 ...
- Mysql 的存储过程和存储函数
优点: v 提高安全性 v 简化mysql查询 v 减轻带宽负担 缺点: v 增加服务器负担 v 对我们开发者来说,难度大一点 PHP中的函数 Function funname(参数){ //函数体 ...
- MySQL中的存储过程、游标和存储函数
MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...
- java调用Oracle中的存储过程与存储函数
1 //调用存储过程 2 public static void testPro(){ 3 String driver = "oracle.jdbc.OracleDriver"; 4 ...
- Mysql之存储过程与存储函数
1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语 ...
- 为什么 C++ 中成员函数指针是 16 字节?
当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小.例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pushes a ...
- 无法执行 FunctionImport“entitys.xx”,因为未将它映射到存储函数。EF
EF突然报了一个这样的错误: 无法执行 FunctionImport"entitys.xx",因为未将它映射到存储函数.EF 其中xx是存储过程: 可能是因为我在.edmx文件中& ...
- mysql存储过程和存储函数
mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...
- 【Java EE 学习 29 上】【PL/SQL】【存储过程】【存储函数】【触发器】
一.PL/SQL简介 1.概念:PL/SQL语言是Oracle数据库专用的一种高级程序设计语言,是对标准SQL语言进行了过程化扩展的语言. 2.功能:既能够实现对数据库的操作,也能够通过过程化语言中的 ...
随机推荐
- jquery 祖先、子孫、同級
jquery向上遍歷,獲取祖先元素 parent()獲取選中元素的父 parents()獲取選中元素的所有的祖先節點,一直到文檔的根元素<html> parentUntil(“元素1”)獲 ...
- Bootstrap输入框组
前面的话 有时,我们需要将文本输入框(input group)和文件或者小icon组合在一起进行显示, 我们称之为addon.也就是通过在文本输入框 <input> 前面.后面或是两边加上 ...
- JavaScript限制前端页面用户表单输入
onkeyup事件 onkeyup 事件会在键盘按键被松开时发生. 内容来源:自成e家 1.只能输入数字 <input onkeyup = "value=value.replace(/ ...
- pip download 只下载不安装命令的使用方法
比如下载 django 1.8.11版本和simplejson 3.14.0版本的包 那么就将所需的包写入 requirement.txt 那么我的requirement.txt内容就是: djan ...
- MT【26】ln(1+x)的对数平均放缩
评:1.某种程度上$ln(1+x)\ge \frac{2x}{2+x}$是最佳放缩. 2.这里涉及到分母为幂函数型的放缩技巧,但是不够强,做不了这题.
- HNOI2018滚粗记
day 0 最近发现机房的人都有些焦虑(除了一些神犇)自己也被影响地紧张起来 唉,不知道是不是一种好的心态,紧张是必然的... 随便打了点板子(\(FFT,SA,LCT\)) 很棒一个都没考 day ...
- MYSQL数据插入和更新的语法
tag:原文章地址 经常会遇到一行数据在特定条件下如果存在就更新列,不存在就插入新的行,用replace和duplicate语法都可以实现,但是也是有区别的.如果是数据覆盖就用replace,如果只是 ...
- 自学Linux Shell6.1-环境变量概念
点击返回 自学Linux命令行与Shell脚本之路 6.1-环境变量概念 环境变量 在Linux中,很多程序和脚本都通过环境变量来获取系统信息.存储临时数据和配置信息: bash shell使用环境变 ...
- Cgod省选的爆零日记
声明 虽然是日记,但博主太咕咕咕了,所以可能会鸽掉. 3.11 辣鸡杭二的机子,卡我常数,削我分数. 他们那边的机子好像比我们慢四倍的样子? 开局刚\(T3\),分数全靠骗. \(yy\)许久\(GG ...
- 百度地图BMapLib.InfoBox 手机兼容源码修改
InfoBox.prototype.initialize = function (map) { var me = this; var div = this._div = baidu.dom.creat ...