Я пишу приложение Cocoa. В приложении есть сокет, и всякий раз, когда сокет становится доступным для чтения, я хочу читать данные из сокета, обрабатывать данные и соответствующим образом обновлять пользовательский интерфейс. Я хочу интегрировать проверку события чтения в основной цикл, т.е. я хочу присоединить сокет к основному циклу и заставить основной цикл вызывать обратный вызов всякий раз, когда этот сокет становится доступным для чтения.
Я написал тестовое приложение, но оно почему-то не работает:
#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;
}
Предполагается, что приложение прослушивает локальный порт 1234, и всякий раз, когда кто-то подключается к серверу или отправляет данные на сервер, приложение должно печатать «Haiz» на консоли. Однако приложение вообще ничего не делает. Сокет создан, и я могу подключиться по телнету к порту 1234, но приложение ничего не выводит на консоль.
Что я делаю неправильно?
alloc
в класс, но не отправкаinit
в экземпляр. Вы полностью забываете об этом с вашим объектом MyDelegate, который хорошо демонстрирует, почему вы всегда должны держатьalloc
иinit
вместе в одном и том же выражении сообщения:MyDelegate *foo = [[[MyDelegate alloc] init] autorelease];
Также обратите внимание, что вы должны освобождать объекты, которые вы выделяете. Просмотрите правила управления памятью: developer.apple. com/mac/library/documentation/Общие/ - person Peter Hosey   schedule 16.02.2010