Я пишу приложение Cocoa. В приложении есть сокет, и всякий раз, когда сокет становится читаемым, я хочу читать данные из сокета, обрабатывать данные и соответственно обновлять пользовательский интерфейс. Я хочу интегрировать проверку событий чтения в основной цикл, т. Е. Я хочу подключить сокет к основному циклу и иметь обратный вызов основного цикла, когда этот сокет становится читаемым.OS X: как смотреть события сокетов с NSRunLoop?
Я написал тестовое приложение, но по какой-то причине он не работает:
#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>
@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end
@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
printf("Haiz\n");
}
@end
int
main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSSocketPort *server = [NSSocketPort alloc];
MyDelegate *foo = [MyDelegate alloc];
[server initWithTCPPort: 1234];
[server setDelegate: foo];
[[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
[[NSRunLoop mainRunLoop] run];
[pool release];
return 0;
}
Приложение должно прослушивать LOCALHOST порт 1234, и всякий раз, когда кто-то подключается к серверу или передает данные на сервер приложение должно печатать «Haiz» на консоли. Однако приложение ничего не делает. Сокет создан, и я могу подключиться к порту 1234, но приложение ничего не печатает на консоли.
Что я делаю неправильно?
Помимо прочего, отправка 'alloc' в класс, но не отправка' init' в экземпляр. Вы полностью забудете об этом с помощью объекта MyDelegate, который хорошо показывает, почему вы всегда должны держать 'alloc' и' init' вместе в одном выражении сообщения: 'MyDelegate * foo = [[[MyDelegate alloc] init] autorelease];' Примечание также что вы должны освобождать объекты, которые вы выделяете. Просмотрите правила управления памятью: http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html –