从 Cycript 访问 <objc/runtime.h>
Accessing <objc/runtime.h> from Cycript
我不想使用关联对象和 ISA swizzle,但我不知道如何导入 objc/runtime.h 以便与 Cycript 一起使用。我在控制台和 .js 文件中都尝试过,但没有成功。
理想情况下,我也想弄清楚如何包含框架。
似乎 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 的 weak_classdump uses the runtime to do it's dump and Cycript's tutorial 展示了如何获取 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"]
我不想使用关联对象和 ISA swizzle,但我不知道如何导入 objc/runtime.h 以便与 Cycript 一起使用。我在控制台和 .js 文件中都尝试过,但没有成功。
理想情况下,我也想弄清楚如何包含框架。
似乎 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 的 weak_classdump uses the runtime to do it's dump and Cycript's tutorial 展示了如何获取 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"]