0

ネットワーク コードを別のクラス IBStore に分離しました。コードは非常に簡単で、提供されているサンプルに基づいています。

#import <UIKit/UIKit.h>
#import "GCDAsyncSocket.h"

@interface IBStore : UIViewController
{
    GCDAsyncSocket *socket;
}
- (void)connect;
- (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port;
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
@end

と:

#import "IBStore.h"

@interface IBStore ()
@end


@implementation IBStore

- (void)connect
{
    socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];    

    NSError *err = nil;
    if (![socket connectToHost:@"127.0.0.1" onPort:80 error:&err]) // Asynchronous!
    {
        // If there was an error, it's likely something like "already connected" or "no delegate set"
        NSLog(@"Connection error: %@", err);
    }
}

メイン ビュー コントローラーから IBStore をインスタンス化する方法は次のとおりです。

- (IBAction)connect:(id)sender {
    IBStore *client = [[IBStore alloc]init];
    [client connect];
}

残念ながら、didConnectToHostアプリは を実行する代わりに、実行中に GCDAsyncSocket.m でクラッシュ (ハング) します。socket4FD = socket(AF_INET, SOCK_STREAM, 0);

なぜこれが起こるのかについてのアイデアは高く評価されます。ありがとうございました!

4

1 に答える 1

0

私のエラーは、メソッドで IBStore クラスを宣言してインスタンス化することでしたconnect。これで、IBStore *client をインスタンス変数として宣言し、完璧に動作しました。

于 2012-06-11T15:11:20.817 に答える