2015-07-09 59 views
0

我不能使用關聯的對象和ISA swizzle,但我無法弄清楚如何導入objc/runtime.h以用於Cycript。我已經嘗試在控制檯和.js文件中,但沒有運氣。從Cycript訪問<objc/runtime.h>

理想情況下,我想弄清楚如何包含框架。

+0

你不需要對相關對象objc/runtime.h。就ISA而言,這是那些在沒有經驗的人手中非常危險的事情之一。控制檯和Javascript與此有什麼關係? – gnasher729

+0

這個問題是關於Cycript的 – Casey

回答

1

看起來好像是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使用運行時進行轉儲,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"]