GKSession displayNameForPeer предотвращает освобождение сессии (iOS 4.0, 4.1) - PullRequest
0 голосов
/ 28 мая 2011

Я могу надежно завершить работу симулятора с этим при выпуске GKSession после вызова displayNameForPeer для другого пира (не самого себя), и я не уверен, что я что-то не так делаю или это ошибка в каркасе Apple Gamekit ( и нужно ли мне беспокоиться об этом, так как я вижу только сбой под 4.0 и 4.1, а не 4.2 +).

Вывод:

found available peer; checking name and ID... m4, 26176566
*** -[GKSessionInternal lock]: message sent to deallocated instance 0x7508900

Вот минимальный воспроизводимый кодовый набор - обратите внимание, что в сети должен быть виден другой сеанс GKS (чтобы был найден доступный одноранговый узел для вызова displayNameForPeer), чтобы вызвать сбой. Выполнение этого же кода на другом устройстве без вызовов makeUnavailable и killSession является адекватным.

- (void)viewDidLoad
{

[self createSession];
[self makeAvailable];

peerListAvailable = [[NSMutableArray alloc] initWithArray:[currentSession peersWithConnectionState:GKPeerStateAvailable]];
for (NSString *peer in peerListAvailable)
{
    // this method guarantees the crash on session release
    NSLog(@"found available peer; checking name and ID... %@, %@",[currentSession displayNameForPeer:peer], peer);
}
[peerListAvailable release];
peerListAvailable = nil;


[self makeUnavailable];
[self killSession];

[super viewDidLoad];
}


- (void) createSession
{
if (!currentSession)
{
    currentSession = [[GKSession alloc] initWithSessionID:@"GKTester" displayName:nil sessionMode:GKSessionModePeer];
    currentSession.delegate = self;
    currentSession.disconnectTimeout = 30;
    [currentSession setDataReceiveHandler: self withContext:nil];
}

}

-(void) killSession
{
if (currentSession) 
{
    [currentSession disconnectFromAllPeers];
    [currentSession setDelegate:nil];
    [currentSession setDataReceiveHandler:nil withContext:nil];
    [currentSession release]; // crash occurs after this
    currentSession = nil;   
}
}

-(void) makeAvailable
{
while (currentSession && !currentSession.available)
{
    [currentSession setAvailable:YES];
    [NSThread sleepForTimeInterval:.5];
}
}

-(void) makeUnavailable
{
while (currentSession && currentSession.available)
{
    [NSThread sleepForTimeInterval:.5];
    [currentSession setAvailable:NO];
}

}

1 Ответ

0 голосов
/ 16 января 2012

В вашем коде избыточный выпуск:

[currentSession disconnectFromAllPeers];
[currentSession setDelegate:nil];
[currentSession setDataReceiveHandler:nil withContext:nil];
[currentSession release]; // This is an over-release
currentSession = nil; // You are trying to access a variable after it's been released

Вы должны освободить переменную-член currentSession только в dealloc, вот так:

- (void)dealloc
{
    [currentSession release];
    [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...