EXC_BAD_ACCESS в разделе оплаты покупок в приложении - PullRequest
11 голосов
/ 27 августа 2011

У меня есть UITableView с различными покупками приложений. Каждая опция ведет вас к контроллеру представления, который также имеет делегата и что не нужно делать в покупках приложения. Файл plist изменяется, чтобы определить, какой параметр в табличном представлении был выбран. Это все отлично работает. Я вставил NSLogs, чтобы убедиться, что переменная была установлена. Однако, когда я нажимаю «купить», он работает только половину времени, а вторую половину я получаю

EXC_BAD_ACCESS

на линии:

[[SKPaymentQueue defaultQueue] addPayment:payment];

Все настроено правильно, насколько покупки в приложении идут, потому что раньше он работал до того, как я переключился на этот способ. Я думаю, что это может иметь какое-то отношение к вызову productsRequest, потому что я настроил NSLog в делегате didReceiveResponse, и он получит ответ намного быстрее после первого раза. Я застрял. Те, которые не работают, всегда случайны, без рифмы и разума. Любая помощь приветствуется.

Ответы [ 5 ]

11 голосов
/ 23 сентября 2011

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

Так, конкретно, я изменил этот код:

- (void) setupAppStoreObserver {
    AppStoreObserver *appStoreObserver = [[AppStoreObserver alloc] init];   
    [[SKPaymentQueue defaultQueue] addTransactionObserver:appStoreObserver];
    [appStoreObserver release]; // This is the problem
}

К этому:

- (void) setupAppStoreObserver {
    AppStoreObserver *appStoreObserver = [[AppStoreObserver alloc] init];   
    [[SKPaymentQueue defaultQueue] addTransactionObserver:appStoreObserver];

    // Note, we don't release the appStoreObserver because it is not
    // actually retained by SKPaymentQueue (probably to prevent retain cycles)
}
10 голосов
/ 02 января 2014

Вам необходимо удалить наблюдателя:

- (void)viewDidDisappear:(BOOL)animated {
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
4 голосов
/ 27 августа 2011

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

1 голос
/ 16 июля 2013

MyStoreObserver * наблюдатель = [[MyStoreObserver alloc] init];

объект-наблюдатель исчез после вызова.Создание переменной-члена для хранения MyStoreObserver может быть исправлением.

0 голосов
/ 09 октября 2012

У меня были те же симптомы: EXC_BAD_ACCESS на addPayment мое решение было другим ... и, в конце концов, легким.

Читая учебник Рэя Вендерлиха, где он обсуждает ошибку EXC_BAD_ACCESS, смотрите это он говорит, что вы получаете эту ошибку, когда пытаетесь обратиться к объекту, который был освобожден.

Я инициализировал MyStoreObserver, где загрузился ViewController. Я переместил это в initWithNibName ... вы знаете, прямо там, где набрал шаблон // Пользовательская инициализация идет здесь. Код, который я там написал, был

    MyStoreObserver *observer = [[MyStoreObserver alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...