Доступ к <objc / runtime.h> из Cycript

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

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

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 Slable_classdump использует среду выполнения, чтобы сделать свой дамп, и учебник 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"]
Другие вопросы по тегам