Разрабатываю приложение, оно получает данные от аксессуара через порт UART. У меня проблема, когда мое приложение работает в течение длительного времени, оно использует гораздо больше памяти, после того, как iPhone перешел в спящий режим и снова проснулся, мое приложение не может открыть сеанс с аксессуаром после того, как аксессуар был полностью аутентифицирован. После отладки класса EAAccessoryManager я вижу два одинаковых устройства, все они мои аксессуары. Зайдите в Настройки / Общие / О программе, я обнаружил, что iphone показывает там два одинаковых устройства. Но моя проблема возникает только на iPhone 3G (версия iOS 4.1), у iPhone 3GS (iOS 4.1) этой проблемы нет. Я предполагаю, потому что моя программа использует слишком много памяти, поэтому я не могу получить события accessoryDidDisconnect. Пожалуйста, дайте мне несколько советов. спасибо за ваш ответ.
-(EASession*) openSessionForProtocol: (NSString*)protocolString
{
NSArray* accessories = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories];
EAAccessory* accessory = nil;
EASession *session = nil;
for(EAAccessory* obj in accessories){
if([[obj protocolStrings] containsObject:protocolString]){
accessory = obj;
break;
}
}
if(accessory){
[accessory setDelegate:self];
session = [[EASession alloc] initWithAccessory:accessory forProtocol:protocolString];
if(session){
NSString *msg = @"";
for(EAAccessory* obj in accessories){
msg = [msg stringByAppendingFormat:@"\n%@",[obj name]];
}
NSString *openSession = [NSString stringWithFormat:@"The number of devices is: %d.%@",[accessories count],msg];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"OpenSession" message:openSession delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
[[session inputStream] setDelegate:self];
[[session inputStream] scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[[session inputStream] open];
[[session outputStream] setDelegate:self];
[[session outputStream] scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[[session outputStream] open];
[session autorelease];
iRemoteAppDelegate *appDelegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate SetApplicationRotation:TRUE];
}
}
return session;
}
- (void)accessoryDidDisconnect:(EAAccessory *)accessory
{
//[HardwareController performSelectorOnMainThread:@selector(UpdateStringOnMessage:) withObject:@"Can not connect hardware module.\nPlease check hardware again." waitUntilDone:YES];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:@"Accessory is unpluged!" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
[[serialSession inputStream] removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[[serialSession outputStream] removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[serialSession release];
self.serialSession = nil;
iRemoteAppDelegate *delegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];
[delegate setUserCancel:NO];
AllowedEmitSignal = TRUE;
[delegate UpdateAboutHardwareDisconnect];
[delegate SetApplicationRotation:FALSE];
}
- (void)accessoryDidConnect:(NSNotification *) notification
{
iRemoteAppDelegate *appDelegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate setUserCancel:NO];
[self OpenPort];
AllowedEmitSignal = TRUE;
[appDelegate UpdateAboutHardwareDisconnect];
appDelegate.CallNumber = appDelegate.CallNumber+1;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:[NSString stringWithFormat:@"Accessory is attached!%d",appDelegate.CallNumber] delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
}
-(void)OpenPort
{
int i =0;
[self initAllVariable];
iRemoteAppDelegate *delegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate];
for (;self.serialSession==nil && i<2; i++) {
self.serialSession = [self openSessionForProtocol:PROTOCOLSTRING];
}
}