0

CocoaAsyncSocketライブラリを使用してTCPソケット接続を作成しています。私が抱えている問題は、いくつかのライブラリメソッドが呼び出された後、エラーが発生することです。

appDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    socket = [[AsyncSocket alloc] initWithDelegate:self];
    NSError *error = nil;
    if (![socket connectToHost:@"199.5.83.63" onPort:11005 error:&error]) 
    {
        NSLog(@"Error connecting: %@", error);
    }

    [socket readDataWithTimeout:10 tag:1];

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[tekMatrixViewController alloc] initWithNibName:@"tekMatrixViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

そして、これがCocoaAsyncSocketライブラリからの私のメソッドです。

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
    NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
    NSLog(@"RX length: %d", [data length]);
    if(msg)
    {
        NSLog(@"RX:%@",msg);
    }
    else 
    {
        NSLog(@"Fail");
    }    
}

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
    NSLog(@"error - disconnecting");
    //start reconnecting procedure here...
}

- (void)onSocketDidDisconnect:(AsyncSocket *)sock
{
    NSLog(@"disconnected");
}

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    NSLog(@"connected");
}

シミュレーターでアプリを実行すると、出力ログから次のように出力されます。

2012-06-08 13:17:30.808 tekMatrix[2793:f803] connected
2012-06-08 13:17:30.815 tekMatrix[2793:f803] RX length: 8
2012-06-08 13:17:30.816 tekMatrix[2793:f803] Fail

その後、このメソッドのAsyncSocket.mファイル(ライブラリの一部)でエラーが発生します。

- (void)scheduleDequeueRead
{
    if((theFlags & kDequeueReadScheduled) == 0)
    {
        theFlags |= kDequeueReadScheduled;
        [self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes];
    }
}

具体的には、エラーはオンラインです。

[self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes];

例外は次のとおりです。 スレッド1:BAD_EXC_ACCESS(コード1 = 0、アドレス= 0xd0688b8a)

その後、アプリはシミュレーターで完全にフリーズします。なぜこれがアプリのフリーズを引き起こしているのかについて誰かが洞察を提供できれば、私は本当に感謝しています。

これが私が使用しているライブラリです: CocoaAsyncSocket

編集:

ゾンビオブジェクトを有効にしてシミュレーターでアプリを実行すると、出力に次のように出力されます。

2012-06-08 14:53:15.416 tekMatrix[3217:f803] *** -[__NSArrayI count]: message sent to deallocated instance 0x6d10a70

これについて少し掘り下げて、何が起こっているのかを理解する必要があります。

編集2:

楽器を使って少し掘り下げた後、私は次のことを発見しました。

An Objective-C message was sent to a deallocated object (zombie) at address: 0x6b8bb10.

編集3:

エラーは次のようになります。

スレッド1:EXC_BREAKPOINT(code = EXC_I386_BPT、subcode = 0x0)

これが楽器のスクリーンショットです。しかし、私はこれをどのように解釈するかについては実際にはフォローしていません。割り当てが解除されたオブジェクトにメッセージを送信しているようです。これは本当ですか?もしそうなら、これがどこで発生するかを理解するにはどうすればよいですか?

画像が見づらい場合は、直接リンクをご覧ください: Instrumentsスクリーンショット

楽器のスクリーンショット

4

2 に答える 2

2

もう存在しないオブジェクトにアクセスしようとしています。おそらく、あなたはそれを保持不足/過剰にリリースしています。

このようなオブジェクトを見つけるためのツールについては、この回答を参照してください: Xcode 4 で NSZombieEnabled を設定するにはどうすればよいですか?

于 2012-06-08T18:40:03.770 に答える
1

事後であることは知っていますが、まったく同じ問題がありました。解決策は、AsyncSocket.m、-fobjc-arc に ARC フラグを追加することでした。

:)

于 2013-12-04T21:35:59.243 に答える