HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – Objective-C为对象的每个方法添加功能大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_1@我想为 objective-c中的对象构建一个插件系统.

现在我陷入了我想要动态地(在运行时)为对象中的每个可用功能添加一行代码的地步.

我已经玩过运行时库,但还没有找到解决方案.

到目前为止我尝试过的是:

id (^impyBlock)(id,id,... ) = ^(id self_,id arguments,...)
        {
            // My custom code for every function here
            id (*funC)(__strong id,SEL,...) = (id (*)(__strong id,...))imp;
            return func(obj,s,arguments);

        };

        id (*impyFunct)(id,...) = imp_implementationWithBlock(impyBlock);
        method_setImplementation(mList[i],impyFunct);

我的问题是,当有多个参数时,我没有机会将它们传递给“func()”. AFAIK这在C中是不可能的.

我想到的另一个解决方案是通过方法调配来做一些魔术.

步骤:

>创建一个“swizzle方法”,它只调用我的自定义代码并在之后调用原始方法(通过命名方案)
>使用“swizzle Method”之一更改每个函数的IMP
>使用“旧”实现创建一个方法,并将名称更改为类似“___name”的模式

在这解决方案中,我陷入了第3点.我还没有设法动态创建一个完整的新方法.

有没有人可以帮助我@L_675_26@上面的问题,或者有一个“捕获所有方法功能”的另一个解决方案.

最好的是类似forWARDInvocation,它也捕获已经定义的函数.

谢谢你的帮助!

解决方法

Lemme把这分为两部分,因为我无法将你的两个问题联系起来.

I.使用“旧”实现创建一个方法,并将名称更改为类似“___name”的模式

这很容易,然我不明白如何@L_675_26@你的问题.你仍然无法将可变参数函数参数传递给这样的方法(你是对的,不能在C中完成).

IMP swapImpForSELEctor(Class cls,SEL sel,IMP newImp)
{
    Method m = class_geTinstanceMethod(cls,sel);
    IMP oldImp = method_setImplementation(m,newImp);

    NSString *newSel = [NSString StringWithFormat:@"__prefixed_%@",NSStringFromSELEctor(sel)];
    @R_607_3377@ *type = method_getTypeEncoding(m);
    class_addMethod(cls,NSSELEctorFromString(newSel),oldImp,typE);

    return oldImp;
}

II.如果你想在函数之间传递可变参数,你可能需要回到沉重的程序集hackage.幸运的是,一些聪明人已经为你做了这件事.

使用NSInvocation class,或者如果不够,那么libffi甚至更低.

大佬总结

以上是大佬教程为你收集整理的ios – Objective-C为对象的每个方法添加功能全部内容,希望文章能够帮你解决ios – Objective-C为对象的每个方法添加功能所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。