2011-01-24 7 views
5

मुझे InAppPurchase को लागू करने में परेशानी हो रही है। खरीद का मेरा कार्यान्वयन मोडल व्यू कंट्रोलर (AppUpgradeViewController) में है, जो कि मैं एक और मोडल व्यू से प्रस्तुत करता हूं। मैं इसे इस तरह कार्य करें:आईफोन - SKProductsRequest और "संदेश को आवंटित उदाहरण में भेजा गया संदेश"

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
NSSet *productIdentifiers = [NSSet setWithObject:kInAppPurchaseProUpgradeProductId]; 
self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; 
self.productsRequest.delegate = self; 
[productsRequest start]; 

तब मैं

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 

को लागू किया है मैं कहाँ कार्य करें::

AppUpgradeViewController * appUpgradeViewController = [[AppUpgradeViewController alloc] init]; 
appUpgradeViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
appUpgradeViewController.delegate = self; 
[self presentModalViewController:appUpgradeViewController animated:YES]; 
[appUpgradeViewController release]; 

फिर, मेरी उन्नयन ध्यान में रखते हुए मैं निम्न कार्य

[self.productsRequest release]; 

और फिर मेरे पास अन्य आवश्यक विधियां हैं।

समस्या है जब मैं मॉडल दिखाने के लिए, और जल्दी से फिर इसे खारिज कुछ सेकंड के बाद मैं कंसोल पर निम्नलिखित मिल गया (मैं NSZombieEnabled चालू किया है):

*** -[AppUpgradeViewController respondsToSelector:]: message sent to deallocated instance 0x2e91f0 

मुझे लगता है कि यह है कि उत्पाद के अनुरोध के साथ कुछ, लेकिन मुझे नहीं पता कि इसे कैसे डिबग या ठीक करना है। ऐसा लगता है कि अनुरोध के लिए उत्तर इस नियंत्रक को खारिज करने के बाद आता है (और अस्वीकृत), लेकिन मुझे नहीं पता कि इसे खारिज/डेलोक के बाद संदेश प्राप्त करने से कैसे रोकें। किसी भी मदद के लिए धन्यवाद! बहुत जल्दी

[appUpgradeViewController release]; 

: क्योंकि आप यह कर रहे हैं

+0

मुझे एक ही समस्या है, लेकिन नीचे दिए गए कोई भी समाधान मेरे लिए काम नहीं करता है। मेरे पास एआरसी सक्षम है। कोई सुझाव? – mvb

उत्तर

0

यह है?

इसे जो भी कक्षा आवंटित कर रहे हैं, उस डेलोक विधि में इसे करने का प्रयास करें। प्रदान करना कि आप इसे एक से अधिक बार आवंटित नहीं कर रहे हैं। यह आपको कक्षा घोषणा में अपनी घोषणा को स्थानांतरित करने की भी आवश्यकता होगी।

+0

मुझे नहीं लगता कि मैं इसे बहुत जल्दी करता हूं। ऐसा लगता है कि कुछ उस नियंत्रक की विधि को बुला रहा है, जब यह निश्चित रूप से नहीं होना चाहिए। – Marcin

2

मुझे लगता है कि ऐसा इसलिए है क्योंकि आपने अपने उत्पादों को जारी किया है, लेकिन ऐसा लगता है कि आपने सूचक को nil पर सेट नहीं किया है जिसका अर्थ है कि यह अभी भी अमान्य स्मृति स्थान पर इंगित कर रहा है।

productsRequest संपत्ति कैसे परिभाषित किया गया है? यह retain विकल्प है, तो बजाय हों तो:

[self.productsRequest release]; 

आपको बस इतना करना:

self.productsRequest = nil; // Property will do the release for you. 

यह assign का विकल्प है, तो आप क्या करने की जरूरत:

[self.productsRequest release]; 
self.productsRequest = nil; // Or else some might access this pointer, 
          // which now might point to nirvana. 
+0

इसे इस तरह परिभाषित किया गया है: @property (nonatomic, retain) SKProductsRequest * productsRequest; – Marcin

+0

उस स्थिति में, आपको केवल 'self.productsRequest = nil;' करने की आवश्यकता है। ** ** ** नहीं करें [self.productsRequest रिलीज]; ', इसका परिणाम स्मृति त्रुटियों में होगा। – DarkDust

+0

इसे इस तरह परिभाषित किया गया है: @property (nonatomic, retain) SKProductsRequest * productsRequest; लेकिन मैं इसे केवल "- (शून्य) उत्पादों में रिलीज़ करता हूं। अनुरोध: (SKProductsRequest *) अनुरोध किया गया था ReceiveResponse: (SKProductsResponse *) प्रतिक्रिया" विधि, इसलिए जब तक नियंत्रक को प्रतिक्रिया प्राप्त नहीं होती तब तक इसे जारी नहीं किया जाता है। यदि नियंत्रक प्रतिक्रिया प्राप्त करने से पहले, मैं तुरंत मोडल को खारिज कर देता हूं, ऐसा नहीं होगा। – Marcin

4

आप शायद AppUpgradeViewController के dealloc:

में अपने अनुरोध प्रतिनिधि को न भूलना भूल गए 10
- (void)dealloc { 
    ... 
    productsRequest.delegate = nil; 
    [productsRequest release], productsRequest = nil; 
    ... 
    [super dealloc]; 
} 
+0

धन्यवाद, आप मेरे दिन को सहेजते हैं !!!!! : डी – SpaceDog

9

मुझे एक ही समस्या थी। एक मोडल व्यू के साथ नहीं, लेकिन नेविगेशन नियंत्रक ढेर पर धक्का दृश्य के साथ। SKProductsRequest के माध्यम से मेरी उत्पाद जानकारी लोड होने से पहले जब मैंने तुरंत वापस नेविगेट किया, तो यह मुझे message sent to deallocated instance अपवाद भी फेंकता है। मैंने अपने SKProductsRequest ऑब्जेक्ट पर cancel विधि (reference देखें) को कॉल करके हल किया।

इसके अतिरिक्त मैं प्रतिनिधि को nil पर भी सेट करता हूं।

यह मेरी उत्पाद अनुरोध है:

NSSet *productIdentifiers = [NSSet setWithObject:@"MY_IDENTIFIER"]; 
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; 
productsRequest.delegate = self; 
[productsRequest start]; 

और यह है कि क्या मैं dealloc विधि में कहा जाता है इसे रद्द करने के लिए है।

productsRequest.delegate = nil; 
[productsRequest cancel]; 
productsRequest = nil; 

मैं भी this answer for another question में वर्णित की तरह SKPaymentQueue से पर्यवेक्षक हटा दिया।

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 
+1

बिल्कुल सही है ... मेरे लिए एक आकर्षण की तरह काम किया;) –

+0

यह पता लगाने में इतना समय लगा। ज़ोंबी ऑब्जेक्ट्स को सक्षम करें जो मुझे फेंक रहा था '- [IAPurchaseViewController retain]: संदेश को आवंटित उदाहरण में भेजा गया। धन्यवाद! – alexgophermix

0

स्विफ्ट 3

यह एक अच्छा विचार है अगर आप इसे शुरू कर दिया अनुरोध बंद करने के लिए है। स्विफ्ट में ऐसा करने का यह एक सुरक्षित तरीका है।

// strong reference at top of class 
    var productRequest: SKProductsRequest! 

    // at some point you will fetch products 

    // on deallocating the window 
    if productRequest != nil { 
     productRequest.cancel() 
     productRequest.delegate = nil 
    } 
संबंधित मुद्दे