2015-07-09 1 views
0

Я не могу использовать связанные объекты и ISA swizzle, но я не могу понять, как импортировать objc/runtime.h для использования с Cycript. Я пробовал как в консоли, так и в .js-файлах, но не повезло.Доступ к <objc/runtime.h> из Cycript

В идеале я хотел бы выяснить, как включить фреймворки.

+0

Вам не нужно ObjC/runtime.h для связанных с ними объектов. И что касается ISA swizzling, это одна из тех вещей, которая очень опасна в руках неопытных. И что делает консоль и 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'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"] 
Смежные вопросы