利用NSInvocation对方法进行抽象,实现对方法的加锁
来源:互联网 发布:心脏支架 知乎 编辑:程序博客网 时间:2024/05/01 13:21
我们在实际开发中需要对离散的方式加锁实现线程安全,当然我们有多种实现方式,这只是其中一种,使用起来比较方便
+ (id)performSelectorWithTarget:(id)target selector:(SEL)selector withObject:(id)arg1 ,...NS_REQUIRES_NIL_TERMINATION;
{
@synchronized(self){
id result =nil;
NSMethodSignature *sig = [targetmethodSignatureForSelector:selector];
if (!sig)return result;
NSInvocation* myInvocation = [NSInvocationinvocationWithMethodSignature:sig];
[myInvocation setTarget:target];
[myInvocation setSelector:selector];
int argumentStart =2;
va_list args;
va_start(args, arg1);// scan for arguments after firstObject.
// get rest of the objects until nil is found
for (id obj = arg1; obj !=nil; obj = va_arg(args,id)) {
[myInvocation setArgument:&objatIndex:argumentStart];
argumentStart++;
}
va_end(args);
[myInvocation retainArguments];
[myInvocation invoke];
//获得返回值类型
constchar *returnType = sig.methodReturnType;
//声明返回值变量
//如果没有返回值,也就是消息声明为void,那么returnValue=nil
if( !strcmp(returnType,@encode(void)) ){
result = nil;
}
//如果返回值为对象,那么为变量赋值
elseif( !strcmp(returnType,@encode(id)) ){
[myInvocation getReturnValue: &result];
}else{
//如果返回值为普通类型NSInteger BOOL
//返回值长度
NSUInteger length = [sigmethodReturnLength];
//根据长度申请内存
void *buffer = (void *)malloc(length);
//为变量赋值
[myInvocation getReturnValue:buffer];
if( !strcmp(returnType,@encode(BOOL)) ) {
result = [NSNumbernumberWithBool:*((BOOL*)buffer)];
}
elseif( !strcmp(returnType,@encode(NSInteger)) ){
result = [NSNumbernumberWithInteger:*((NSInteger*)buffer)];
}else {
result = [NSValuevalueWithBytes:buffer objCType:returnType];
}
free(buffer);
}
return result;
}
}
- 利用NSInvocation对方法进行抽象,实现对方法的加锁
- oracle对select加锁方法、锁的查询
- oracle对select加锁方法、锁的查询
- oracle对select加锁方法、锁的查询
- 利用List的subList方法,实现对List分页
- javassist实现对类的任意方法进行代码增强
- Java 对Map进行排序的实现方法
- Jersey实现对方法进行过滤拦截
- java 对文件进行加锁
- 对Lu模块进行加锁
- 利用Matrix对图片进行变换以及实现动画方法浅谈
- 利用java反射机制对方法进行调用
- 利用反射对私有属性/方法进行设置/调用
- 利用Arrays类中的方法对数组进行排序
- 自定义注解及利用AOP对方法进行加强处理
- 对jQuery的html()方法进行分析
- 对文件进行部分备份的方法
- 对List进行排序的方法
- Sublime Text查询条件正则表达式
- 常见面试第二题之什么是Context
- 升级 Xcode 6.4 后 Alcatraz 消失的问题
- sql之left join、right join、inner join的区别
- LabVIEW中访问数据库的几种不同方法
- 利用NSInvocation对方法进行抽象,实现对方法的加锁
- linux inifile.h
- 百度编辑器ueditor1.4.2-更改图片上传路径和图片读取路径
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现(第二版)
- Linux下安装使用f.lux
- Android运行时ART简要介绍和学习计划
- 【字符串操作】 寻找两个字符串中的 最大公共子串
- Laravel框架学习记录一 框架基础
- 数据库中几个基本概念 主码 外码