PyObjC: как удалить существующий класс Objective-C

Ранее я создал класс ObjC. Как я могу удалить его снова? Потому что в какой-то момент я хочу воссоздать его в другой версии.

Прямо сейчас, если я просто объявлю его повторно, я получу исключение X is overriding existing Objective-C class.


person Albert    schedule 09.09.2011    source источник


Ответы (1)


Я не знаю, как это сделать в PyObjC, но функция времени выполнения Objective-C для этого должна быть objc_disposeClassPair(). Небольшой поиск показал, что использование этой функции среды выполнения Objective-C может не работать в PyObjC:

Сообщение фиксации PyObjC SVN от января 2008 года гласит: Initial attempt of using objc_disposeClassPair. Disabled because this causes an unexpected crash. http://blog.gmane.org/gmane.comp.python.pyobjc.cvs/month=20080101

Рассматриваемый код все еще находится в текущем class-builder.m исходного кода PyObjC в строке 164ff и имеет префикс с интересным комментарием:

    /*
     * Call this when the python half of the class could not be created. 
     *
     * Due to technical restrictions it is not allowed to unbuild a class that
     * is already registered with the Objective-C runtime.
     */
    int 
    PyObjCClass_UnbuildClass(Class objc_class __attribute__((__unused__)))
    {
        PyObjC_Assert(objc_class != nil, -1);
        PyObjC_Assert(objc_lookUpClass(class_getName(objc_class)) == nil, -1);

        //objc_disposeClassPair(objc_class);
        return 0;
    }

При этом я никогда не использовал это в самом Objective-C и мало знаю о PyObjC. Надеюсь это поможет.

person Marco Masser    schedule 09.09.2011
comment
Я пытался через ctypes вызвать objc_disposeClassPair, но также сразу же получаю сбой. Интересно, почему... - person Albert; 10.09.2011
comment
А, мне это удалось. Я просто мог установить неправильные типы аргументов функции ctypes. Этот пример работает. - person Albert; 10.09.2011