2015-07-13 4 views
1

Я пытался написать простой клиент UDP, который может отправлять и получать данные, и я хочу, чтобы делегат был назначен другому объекту, кроме себя.Настройка делегирования другому объекту в Cocoaasyncsocket

Я могу отправлять данные, но не могу получить обратно с сервера. Сервер работает нормально.

Мой код, как показано ниже:

//ViewController.m 
- (void)setupSocket 
{ 

    UDPReveiver * udp = [[UDPReveiver alloc] init]; 
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:udp delegateQueue:dispatch_get_main_queue()]; 

    NSError *error = nil; 

    if (![udpSocket bindToPort:5528 error:&error]) 
    { 
     NSLog(@"Error binding: %@", error); 
     return; 
    } 
    if (![udpSocket beginReceiving:&error]) 
    { 
     NSLog(@"Error receiving: %@", error); 
     return; 
    } 

    NSLog(@"Socket Created :)"); 
} 

//UDPReceiver.h 

@interface UDPReveiver : NSObject <GCDAsyncUdpSocketDelegate> 

//UDPReceiver.m 

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data 
    fromAddress:(NSData *)address 
withFilterContext:(id)filterContext 
{ 
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"Hey"); 
    if (msg) 
    { 
     NSLog(@"Data received is :%@",msg); 
    } 
} 

Пожалуйста, дайте мне знать, что я пропускаю.

ответ

0

Проблема в том, что UDPReveiver *udp будет выпущен, когда он погаснет, и это сразу. Некоторым объектом, например, может быть контроллер вида, который создает udp, должен быть владельцем этого делегата, сохраняя его в свойстве strong. Это дает экземпляру udp значение удержания выше нуля, тем самым поддерживая его. Так что ...

// in the ViewController's interface... 
@property(strong, nonatomic) UDPReveiver *udp; 

Тогда ваша установка ...

- (void)setupSocket 
{ 
    self.udp = [[UDPReveiver alloc] init]; 
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self.udp delegateQueue:dispatch_get_main_queue()]; 

    // and so on 

Когда вы закончите с гнездом, ваш контроллер представления может отказаться от делегата, например:

self.udp = nil; 

... или он будет отпущен, когда выйдет контроллер вида.

+0

Спасибо, danh отлично работает сейчас. –