5

私はARMv7 IOSデバイスで標準的な方法のスウィズリングを使用していますが、それは私にとって完璧に機能します.

しかし、arm64 用にコードをコンパイルすると、新しいメソッドから元のメソッドを呼び出すことができません。

スウィズリングの主な目的 - アプリケーションの内部メソッドのパラメーターを別のメソッドで使用すること。

元のメソッドがあり、それを変更して新しいメソッドで元のメソッドを呼び出し-(void)insertdata:(id)textたいです。-(void)patchedCall:(id)text

コード:

static IMP sOriginalImp = NULL;

@interface TextOverrides: NSObject
+(void)load;
-(void)patchedinsert:(id)text;
@end

@implementation TextOverrides

+(void)load
{
    //Get Implementation of original method

    Class originalClass = NSClassFromString(@"DataViewController");
    Method originalMeth = class_getInstanceMethod(originalClass, @selector(insertdata:));

    //Save original method implementation
    sOriginalImp = method_getImplementation(originalMeth);

    // Get implementation of replacement method
    Method replacementMeth = class_getInstanceMethod(NSClassFromString(@"TextOverrides"), @selector(patchedCall:));

    //Replace methods
    method_exchangeImplementations(originalMeth, replacementMeth);
}

-(void)patchedCall:(id)text
{
    @synchronized(self){
        //Call of original method that we save
        sOriginalImp(self, @selector(insertdata:), text);

        //Make our code for argument "text"
        printf("Here is data%s\n", [text UTF8String]);
    }
}

@end

arm64 アーキテクチャで元のメソッドを呼び出すと、コードが失敗します。

//Call of original method that we save
sOriginalImp(self, @selector(insertdata:), text);

armv7 と arm64 の両方で動作するようにコードを改善するにはどうすればよいですか?

4

2 に答える 2

2

https://github.com/square/PonyDebugger/issues/84に関する議論で、要点はhttps://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/だと思いますConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW22IMPと可変引数関数として定義されており、固定引数で呼び出すという事実。私の場合、関数ポインターを実際の署名にキャストすると、クラッシュが修正されました。私はあなたのケースを信じています

//Call of original method that we save
((void(*)(id, SEL, id))ssOriginalImp)(self, @selector(insertdata:), text);

クラッシュを修正できます。

于 2015-02-12T15:43:13.847 に答える