object_getInstanceVariable работает на плавание, интервал, bool, но не на дважды?

Я не думаю, что это была бы хорошая идея записать реальный почтовый сервер в Python. Это, конечно, возможно (см. сообщения mcrute и Manuel Ceron для имения деталей), но это - большая работа при размышлении обо всем, что реальный почтовый сервер должен обработать (организация очередей, повторная передача, контакт со спамом, и т.д.).

необходимо объяснить более подробно, в чем Вы нуждаетесь. Если бы Вы просто хотите реагировать на входящую электронную почту, я предложил бы настроить почтовый сервер для вызова программы, когда это получает электронное письмо. Эта программа могла сделать то, что она хочет (обновление базы данных, создавая файл, говоря с другой программой Python).

Для вызова произвольной программы от почтового сервера у Вас есть несколько вариантов:

  1. Для sendmail и Постфикса, ~/.forward содержащий "|/path/to/program"
  2. , Если Вы используете procmail, действие рецепта |path/to/program
  3. И конечно многие другие
12
задан Community 23 May 2017 в 11:55
поделиться

2 ответа

object_getInstanceVariable - это маленькая запутанная функция. задокументировано , что последним параметром является параметр void ** , то есть вы передаете адрес переменной void * и получаете указатель на переменная экземпляра - но она реализована так, как если бы она была параметром void * , то есть вы передаете адрес переменной, копию которой вы хотите сохранить. Проблема в том, что реализация игнорирует размер переменной экземпляра и просто копирует указатель. Так что все, что имеет размер указателя, будет работать идеально. Если вы работаете с 32-битной архитектурой, будут скопированы только старшие 32 бита. (Вы должны наблюдать такое же поведение с переменной экземпляра long long . )

Решение состоит в том, чтобы использовать основной API, кодирование значения ключа , используя -valueForKey: .

Другое решение: если вы хотите написать фиксированную версию , скажем, в качестве категории для NSObject он будет выглядеть примерно так:

@implementation NSObject (InstanceVariableForKey)

- (void *)instanceVariableForKey:(NSString *)aKey {
    if (aKey) {
        Ivar ivar = object_getInstanceVariable(self, [aKey UTF8String], NULL);
        if (ivar) {
            return (void *)((char *)self + ivar_getOffset(ivar));
        }
    }
    return NULL;
}

@end

Тогда ваш код будет выглядеть так:

double myDoubleValue = *(double *)[self instanceVariableForKey:@"someDouble"];
29
ответ дан 2 December 2019 в 04:53
поделиться

А как насчет использования valueForKey:?

NSNumber * value = [self valueForKey:[NSString stringWithUTF8String:ivar_getName(tmpIvar)]];
NSLog(@"Double value: %f", [value doubleValue];

Примечание: для этого у вас должен быть метод someFloat. Если вы хотите использовать setValue: forKey :, вам также понадобится метод setSomeFloat :. Это легко реализовать, объявив ivar как @property и синтезируя его.

2
ответ дан 2 December 2019 в 04:53
поделиться