2012-12-05 15 views
10

not much report on the crashAwaria aplikacji w [[SKPaymentQueue defaultQueue] addTransactionObserver: obserwator];

To wszystko, co mogę dostać od katastrofy, kiedy zrobić w applicationDidBecomeActive

MyStoreObserver * observer = [[MyStoreObserver alloc] initWithContext:self.managedObjectContext andDelegate:self]; 

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 

Ale dziwne jest to, że udało nam się zakupić dwa razy w przeszłości, nawet jeśli usunąć aplikację Ponownie połączyć wszystko, czego nie mogę uciec z tego dołu. To nie wydaje się logiczne. Mogę przydzielić init samego obserwatora bez problemu i mogę wywołać domyślny paymentQueue bez problemu, ale jeśli spróbuję dodać obserwatora transakcji do kolejki, życie się zatrzyma. Jest na ARC, a delegat, który dodałem do obserwatora, nie jest problemem. Wiem to na pewno.

Dodałem takie NSLog do każdej metody w obserwatora i żadna sprawdzony przed katastrofą

Rozwiązaniem znalezionym

Dobra, wygląda na to, obserwator nie jest zatrzymywana przez kolejce, a tym samym obserwator musi być zmienną instancji.

Dzięki

+0

Może powinieneś dodać Cię rozwiązanie jako odpowiedź i oznacz to jako rozwiązanie, w przeciwnym razie nagroda pozostanie otwarta. –

Odpowiedz

10

porządku, dobrze wygląda obserwator nie jest zatrzymywana przez kolejce, a więc obserwator musi być zmienną instancji (lub zatrzymane w pewnym sensie).

+0

czy mógłbyś podać przykładowy kod? Zmienna instancji –

+0

oznacza, że ​​należy pozostawić wskaźnik na obiekcie, aby nie został zwolniony. Możesz po prostu stworzyć nieruchomość (mocną), która wskaże twojemu obserwatorowi –

1

Aby dodać oficjalne źródło tej odpowiedzi:

Wewnątrz SKPaymentQueue.h pliku nagłówka ramowej Storekit jest następujący jasnego Komentarz:

// Observers are not retained. 
// The transactions array will only be synchronized with the server while the queue has observers. 
// This may require that the user authenticate. 
- (void)addTransactionObserver:(id <SKPaymentTransactionObserver>)observer __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
Powiązane problemy