GKSession alloc / release / alloc = утечки и сбои - PullRequest
2 голосов
/ 05 сентября 2010

У меня есть приложение, которое выбрасывает GKSession и создает новое при различных условиях (тайм-аут соединения, сбой сеанса и т. Д.). Я получаю утечки памяти, и иногда происходит сбой после нескольких циклов повторного подключения.

Вот мой код:

- (void) netConnect:(id) sender {
     NSLog(@"allocating GKSession");

     currentSession = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer];
     currentSession.delegate = self;
     currentSession.available = YES;
     currentSession.disconnectTimeout = 0;
     [currentSession setDataReceiveHandler: self withContext:nil]; 
        }

- (void) netDisconnect:(id) sender {
     NSLog(@"DISCONNECTING BY REQUEST");

     [currentSession disconnectFromAllPeers];
     [currentSession setAvailable:NO];
     [currentSession setDelegate:nil];
     [currentSession setDataReceiveHandler:nil withContext:nil];
     [currentSession release];
     currentSession = nil;
    }

Есть таймер, который ожидает успешного соединения; если он не получен, вызывается netDisconnect, затем снова следует netConnect после 5-секундной задержки NSTimer.

У меня просачиваются объекты GKList, GKTable и GKAutoPeerIDTable, и происходит сбой (например, всегда происходит после alloc):

  Date/Time:       2010-09-05 09:35:59.426 -0700
  OS Version:      iPhone OS 4.0.2 (8A400)
  Report Version:  104

  Exception Type:  EXC_BAD_ACCESS (SIGBUS)
  Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000a
  Crashed Thread:  0

  Thread 0 Crashed:
  0   libobjc.A.dylib                0x0000286c objc_msgSend + 16
  1   CoreFoundation                 0x000756ea __CFCopyFormattingDescription + 174
  2   CoreFoundation                 0x00081c8e __CFStringAppendFormatCore + 8666
  3   CoreFoundation                 0x000146ac _CFStringCreateWithFormatAndArgumentsAux + 64
  4   CoreFoundation                 0x00014660 CFStringCreateWithFormatAndArguments + 16
  5   CoreFoundation                 0x0001463c CFStringCreateWithFormat + 16
  6   SystemConfiguration            0x00003272 SCDynamicStoreCreateWithOptions + 62
  7   SystemConfiguration            0x000033d0 SCDynamicStoreCreate + 12
  8   GameKitServices                0x000020ce gckRegisterForNetworkChanges + 154
  9   GameKitServices                0x000035c0 GCKSessionCreate + 788
  10  GameKitServices                0x00035e7a -[GKSessionInternal initWithSessionID:displayName:session:sessionMode:] + 274
  11  GameKit                        0x0000fda8 -[GKSession initWithSessionID:displayName:sessionMode:] + 76

Вот еще один:

Sun Sep  5 10:28:52 thinner someapp[424] <Warning>: allocating GKSession
Sun Sep  5 10:28:52 thinner someapp[424] <Error>: -[__NSCFData UTF8String]: unrecognized selector sent to instance 0x10a710
Sun Sep  5 10:28:52 thinner someapp[424] <Error>: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData UTF8String]: unrecognized selector sent to instance 0x10a710'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x31a9ffd3 __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x3428a8a5 objc_exception_throw + 24
    2   CoreFoundation                      0x31aa3a77 -[NSObject(NSObject) doesNotRecognizeSelector:] + 102
    3   CoreFoundation                      0x31aa2f15 ___forwarding___ + 508
    4   CoreFoundation                      0x31a35680 _CF_forwarding_prep_0 + 48
    5   GameKitServices                     0x327aff13 -[GKSessionInternal initWithSessionID:displayName:session:sessionMode:] + 426
    6   GameKit                             0x31c15daf -[GKSession initWithSessionID:displayName:sessionMode:] + 82
    7   someapp                        0x0000584b -[MainViewController netConnect:] + 126

Вопросы:
• Это правильный способ выпуска и перераспределения GKSessions?
• Не следует ли мне начинать срывать и перераспределять сеансы GKS между соединениями для начала?

1 Ответ

3 голосов
/ 07 октября 2010

Это известная проблема. Обходной путь - не передавать nil для sessionID: [[GKSession alloc] initWithSessionID: @ "com.put.something.here" displayName: nil sessionMode: GKSessionModePeer];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...