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スクリーンショット