2016-01-28 1 views
3

Сервер:передачи сообщений между процессом над NSMachport

 NSMachPort *serverPort = (NSMachPort *)([[NSMachBootstrapServer sharedInstance] servicePortWithName:@"com.mycomp.checker.myport"]); 

    [serverPort setDelegate:[[MachPortMEssageHandler alloc] init]]; 


    NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 

    [runloop addPort:serverPort forMode:NSDefaultRunLoopMode]; 

    [runloop run]; 

Клиент:

NSString *name = @"com.mycomp.checker.myport"; 
    NSMachPort *port = (NSMachPort *) [[NSMachBootstrapServer sharedInstance] portForName:name]; 

    if (port) { 

     [port sendBeforeDate:[NSDate date] components:[NSMutableArray array] from:nil reserved:0]; 
    } 

Сервер сохраняет сбой с EXC_BAD_ACCESS в [runloop Run] линии. Любые рекомендации по правильному использованию класса NSMachport для межпроцессного взаимодействия

ответ

4

Делегат от NSMachPort является слабым. Нет никаких оснований полагать, что это слабое свойство с нуля, внутренне. Совершенно очевидно, что ваш экземпляр MachPortMEssageHandler освобождается почти сразу. Это открытый вопрос, имеет ли объект порта сервера висячий указатель на него, как только он это сделает. Поскольку вы столкнулись с крахом, я подозреваю, что это так. Вы можете запустить с помощью Zombies, чтобы убедиться в этом.

Вам нужно сохранить сильную ссылку на объект делегата на время.

+0

Спасибо, Кен, это сработало, следующая задача - узнать, как вернуть исходное сообщение, отправленное с клиента на делегат сервера, все, что у меня есть (void *), любые идеи? –

+0

'void *' является указателем на структуру сообщений Mach, начиная с 'msg_header_t'. Если вы еще не знакомы с сообщениями Mach, вы, вероятно, не должны использовать 'NSMachPort'. Просто используйте 'NSPort',' NSPortDelegate', его метод '-handlePortMessage:' и 'NSPortMessage'. Еще лучше, если вам не нужен обмен сообщениями низкого уровня, используйте [Распределенные объекты] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DistrObjects/DistrObjects.html). –

+0

закончил использование распределенных объектов. Но XPC с обработчиками недействительности выглядит правильно для IPC. –

Смежные вопросы