zoukankan      html  css  js  c++  java
  • 利用NSInvocation对方法进行抽象,实现对方法的加锁

    我们在实际开发中须要对离散的方式加锁实现线程安全,当然我们有多种实现方式,这仅仅是当中一种,使用起来比較方便


    + (id)performSelectorWithTarget:(id)target selector:(SEL)selector withObject:(id)arg1 ,...NS_REQUIRES_NIL_TERMINATION;

    {

        @synchronized(self){

            id result = nil;

            NSMethodSignature *sig = [target methodSignatureForSelector:selector];

            if (!sig) return result;

            

            NSInvocation* myInvocation = [NSInvocation invocationWithMethodSignature: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:&obj atIndex:argumentStart];

                argumentStart++;

            }

            

            va_end(args);

            

            [myInvocation retainArguments];

            [myInvocation invoke];

            

            //获得返回值类型

            const char *returnType = sig.methodReturnType;

            

            //声明返回值变量

            //假设没有返回值,也就是消息声明为void,那么returnValue=nil

            

            if( !strcmp(returnType, @encode(void)) ){

                

                result =  nil;

            }

            

            //假设返回值为对象。那么为变量赋值

            else if( !strcmp(returnType, @encode(id)) ){

                [myInvocation getReturnValue: &result];

            }else{

                

                //假设返回值为普通类型NSInteger  BOOL

                //返回值长度

                

                NSUInteger length = [sig methodReturnLength];

                

                //依据长度申请内存

                void *buffer = (void *)malloc(length);

                

                //为变量赋值

                

                [myInvocation getReturnValue:buffer];

                

                if( !strcmp(returnType, @encode(BOOL)) ) {

                    

                    result = [NSNumber numberWithBool:*((BOOL*)buffer)];

                }

                else if( !strcmp(returnType, @encode(NSInteger)) ){

                    

                    result = [NSNumber numberWithInteger:*((NSInteger*)buffer)];

                }else {

                    result = [NSValue valueWithBytes:buffer objCType:returnType];

                }

                

                free(buffer);

            }

            return result;

        }

    }

  • 相关阅读:
    2月份热门的 24 个 jQuery 插件
    走近求伯君1 求伯君,1964年11月26日出生于浙江新昌县。
    转CSDN,13原则
    SQL Server数据库如何正确加密?
    Zend Studio提供zend studio教程、zend studio下载等相关资源的公益性站点。 订阅
    高端人才必看,生意人必读
    有速度才有效率,支持Google gear离线的网站和应用
    2009.08.20总结与微软中国开发部经理段老师的通话无锡德立解决方案
    从SOA、SaaS到博科自主配置平台
    MySQL 1045错误的解决方法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5283683.html
Copyright © 2011-2022 走看看