Когда выпустить при использовании «withCompletionHandler» - PullRequest
2 голосов
/ 06 апреля 2011

Я использую блок для выполнения каких-либо действий при получении данных, но когда я освобождаю созданный ранее массив?

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
if (leaderboardRequest != nil) {
    [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
        // do stuff
        // release leaderboardRequest here?
    }];
}
// or here?

Похоже, что он работает в другом потоке, поэтому я обеспокоен тем, что, если я выпущу его в конце, я могу помешать коду завершения.

1 Ответ

1 голос
/ 06 апреля 2011

Безопасно выпускать LeaderboardRequest, потому что блок будет следить за тем, чтобы локальная переменная сохранялась до завершения вашего кода. LeaderboardRequest будет неизменным, если не определено с __block, но я сомневаюсь, что вам нужно будет изменить ссылку.

Прочитайте тему программирования блоков .

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
if (leaderboardRequest != nil) {
    [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
        // do stuff
        // release leaderboardRequest here? NO!
    }];
}
// Here
[leaderboardRequest release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...