我将无法使用关联的对象和ISA混乱,但是我不知道如何导入objc / runtime.h以与Cycript一起使用。我在控制台和.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的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"]

关于ios - 从Cycript访问<objc/runtime.h>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31329942/

10-10 20:53