Похоже, что подмножество runtime.h включено по умолчанию в среду Cycript. Например, 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's weak_classdump использует время выполнения, чтобы сделать это, а файл tutorial 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"]
Вам не нужно ObjC/runtime.h для связанных с ними объектов. И что касается ISA swizzling, это одна из тех вещей, которая очень опасна в руках неопытных. И что делает консоль и Javascript? – gnasher729
вопрос о Cycript – Casey