0

関連オブジェクトと ISA スウィズルを使用したくないのですが、Cycript で使用するために objc/runtime.h をインポートする方法がわかりません。コンソールと .js ファイルの両方で試しましたが、うまくいきませんでした。

理想的には、フレームワークも含める方法を理解したいと思っています。

4

1 に答える 1

1

Cycript 環境にはデフォルトで runtime.h のサブセットが含まれているようです。たとえば、class_copyMethodList と objc_getClass は、追加の手間をかけずに機能します。

var count = new new Type(@encode(int));
var methods = class_copyMethodList(objc_getClass("NSObject"), count);

ただし、objc_setAssociatedObject は参照されません。

objc_getAssociatedObject(someVar, "asdf")
#ReferenceError: Can't find variable: objc_getAssociatedObject

何度も検索した後、答えがすぐ目の前にあることに気付きました。limneos のweak_classdumpはランタイムを使用してダンプを行い、Cycript のチュートリアルは C 関数を取得する方法を示しています。

私が最終的に得た解決策はこれです:

function setAssociatedObject(someObject, someValue, constVoidPointer) {
    SetAssociatedObject = @encode(void(id, const void*, id, unsigned long))(dlsym(RTLD_DEFAULT, "objc_setAssociatedObject"))
    SetAssociatedObject(someObject, constVoidPointer, someValue, 1)
}

function getAssociatedObject(someObject, constVoidPointer) {
    GetAssociatedObject = @encode(id(id, const void*))(dlsym(RTLD_DEFAULT, "objc_getAssociatedObject"))
    return GetAssociatedObject(someObject, constVoidPointer)
}

次のように使用されます。

# create void pointer (probably should be a global variable for later retrieval)
voidPtr = new new Type(@encode(const void))

someVar = [[NSObject alloc] init]
setAssociatedObject(someVar, @[@"hello", @"world"], voidPtr)
getAssociatedObject(someVar, voidPtr)
# spits out @["Hello", "World"]
于 2015-07-25T19:30:13.553 に答える