从Cycript访问<objc runtime.h =“”>

时间:2015-07-09 23:18:55

标签: ios cycript

我不能使用关联对象和ISA swizzle,但我无法弄清楚如何导入objc / runtime.h以与Cycript一起使用。我已经在控制台和.js文件中尝试过但没有运气。

理想情况下,我想了解如何包含框架。

1 个答案:

答案 0 :(得分: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的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"]