関連オブジェクトと ISA スウィズルを使用したくないのですが、Cycript で使用するために objc/runtime.h をインポートする方法がわかりません。コンソールと .js ファイルの両方で試しましたが、うまくいきませんでした。
理想的には、フレームワークも含める方法を理解したいと思っています。
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"]