2012-04-20 18 views
7

परीक्षण के दौरान एआरसी का उपयोग करके मुझे एक समस्या है जहां मुझे खराब पहुंच अपवाद मिल रहे हैं, लेकिन केवल परीक्षण निर्माण चलाते समय (डीबग बिल्ड में समान विधियों को कॉल करने से समस्या उत्पन्न नहीं होती है)। परियोजना एआरसी में सक्षम बनाया है और मैं Xcode 4.3 का उपयोग करके आईपैड 5.1 सिम्युलेटर पर इस चल रहा हूँ:EXC_BAD_ACCESS केवल

यहाँ है, जहां समस्या को फसलों:

- (void)testChangeFoodNotification { 
    Player* p = [[Player alloc] init]; 
    [p addObserver:self forKeyPath:@"food" options:0 context:0]; // <-EXC_BAD_ACCESS (code=2) 
    p.food += 1; 
    STAssertTrue(_wasNotifiedOfFoodChange, nil); 
} 

बिंदु पर जब addObserver: विधि कहा जाता है ऐसा नहीं ' ऐसा लगता है कि शामिल किसी भी वस्तु को जारी किया जाना चाहिए था ताकि अपवाद पैदा हो सके?

संपादित करें:

क्षमा याचना करता है, तो यह स्पष्ट नहीं था लेकिन कोड ऊपर एक टेस्ट केस के हिस्से के रूप निष्पादित किया जा रहा है (मानक Xcode OCUnit का उपयोग)। इसके अलावा मामले में यह कुछ भी स्पष्ट किया यहाँ खिलाड़ी वर्ग से प्रासंगिक कोड है (वहाँ अन्य ivars और विधियों है, लेकिन वे संपत्ति या तरीकों के लिए किसी भी कनेक्शन नहीं परीक्षण किया जा रहा है):

// Public interface 
@interface Player : NSObject 

@property (nonatomic, assign) NSInteger food; 

@end 

// Private interface 
@interface Player() { 
    NSInteger _food; 
} 

@end 

@implementation Player 

@synthesize food = _food; 

#pragma mark - Getters/Setters 

- (void)setFood:(NSInteger)food { 
    [self willChangeValueForKey:@"food"]; 
    _food = food; 
    [self didChangeValueForKey:@"food"];  
} 

उत्तर

21

यदि आपकी कक्षा वास्तव में महत्वपूर्ण मूल्यवान है, तो सुनिश्चित करें कि इस मुद्दे को प्रदर्शित करने वाले वर्ग के कार्यान्वयन को आपके परीक्षण उत्पाद में शामिल नहीं किया गया है। इसका मतलब है कि आपकी .m फ़ाइल के लिए पहचान निरीक्षक के लक्ष्य सदस्यता पैनल में केवल आपके ऐप की जांच होनी चाहिए (आपका ऐपटेस्ट नहीं)।

मुझे एक्सकोड 4.3.1 में एक ही समस्या का अनुभव हुआ जब दोनों उत्पादों में एक कार्यान्वयन शामिल किया गया था और मैंने उत्पादन और परीक्षण कोड दोनों में पर्यवेक्षकों को पंजीकृत किया था। निम्नलिखित लॉग मुझसे दूर टिप:

कक्षा YourClass दोनों में कार्यान्वित किया जाता/उपयोगकर्ताओं/yourUser/लायब्रेरी/एप्लिकेशन समर्थन/iPhone सिम्युलेटर/5.1/आवेदन // YourApp.app/YourApp और/उपयोगकर्ताओं/yourUser/Library/डेवलपर/Xcode/DerivedData/YourApp-/बिल्ड/उत्पाद/डीबग-iphonesimulator/YourAppTests.octest/YourAppTests। इन दोनों में से कोई एक प्रयोग किया जाएगा। कौन सा अपरिभाषित है।

+3

मेरी इच्छा है कि मैं इस 100 बार ऊपर उठा सकता हूं। धन्यवाद! – DexterW

+0

मुझे कोकोपोड्स के साथ इस मुद्दे का भी सामना करना पड़ा। क्लास कार्यान्वयन फ़ाइल को ऐप और ऐप परीक्षण लक्ष्य दोनों के लिए फोड में शामिल किया गया था, सिवाय इसके कि लॉग में कोई डुप्लिकेट क्लास चेतावनी नहीं थी। – Eric

0

Key-Value Observing Programming Guide के अनुसार, है आपके प्लेयर कुंजी-मूल्य-अनुरूप? आप यह सुनिश्चित करना चाहते हैं कि आप Ensuring KVC Compliance हैं। मुझे यह भी लगता है कि आपने अपना observeValueForKeyPath:ofObject:change:context: भी कार्यान्वित किया है? अगर आपको लगता है कि आपने यह सब किया है और यह अभी भी काम नहीं कर रहा है, तो शायद आप अपना कोड साझा कर सकते हैं।

इसके अलावा, मामूली चीज़, लेकिन मुझे लगता है कि यह समस्या को हाइलाइट करने के लिए एक कोड स्निपेट है। मैं केवल इसका जिक्र करता हूं क्योंकि एआरसी आपके परीक्षण के अंत में आपके पी ऑब्जेक्ट को जारी करने जा रहा है चेंजफूड नोटिफिकेशन और मैंने सोचा होगा कि आप पहले अपने पर्यवेक्षक को हटाना चाहते हैं।

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे कुछ याद आ रहा है लेकिन मुझे लगता है कि कक्षा केवीसी अनुपालन (तथ्य यह है कि एक ही कोड परीक्षण परीक्षण के बाहर काम करता है मुझे लगता है कि यह अनुपालन है लेकिन मैं गलत हो सकता हूं - यह मेरा पहला समय केवीसी/केवीओ का उपयोग कर रहा है)। पर्यवेक्षक को हटाने के लिए। आम तौर पर मैं चाहता था कि मुझे लगता है कि चूंकि यह एक टेस्ट केस विधि है और दोनों पी और पर्यवेक्षक को फिर से नष्ट करने जा रहे हैं, इससे पहले कि पी को संशोधित करने का कोई मौका हो, बॉयलरप्लेट के साथ टेस्ट विधि को अपनाने से बचाना बेहतर होगा। हालांकि मैं गलत हो सकता था और अगर मैं हूं तो मुझे यह सुनना अच्छा लगेगा;) – Mattia

+0

हाँ, मैं इसे नहीं देख रहा हूं। माफ़ कीजिये। मुझे समझ में नहीं आ रहा है कि आप _food के लिए अपने निजी इंटरफेस को क्यों परिभाषित कर रहे हैं और न ही आप अपना खुद का सेटटर क्यों लिखते हैं (@ सिंथेसाइज स्टेटमेंट आपके लिए दोनों करता है), लेकिन संदेह है कि यह समस्या का स्रोत है। सबसे महत्वपूर्ण बात यह है कि मुझे समझ में नहीं आता कि आपको टेस्ट वी डीबग बिल्ड में अलग-अलग व्यवहार क्यों मिलता है। मैं केवल सुझाव दे सकता हूं कि आप अपनी योजना के निर्माण में अपनी योजना को संशोधित करके ज़ोंबी चालू करें, अगर आपने पहले से नहीं किया है, और देखें कि यह अधिक प्रबुद्ध है या नहीं। – Rob

+0

मूल रूप से मैं अपने स्वयं के सेटर्स नहीं जोड़ रहा था, लेकिन मैंने उन्हें यह देखने के लिए जोड़ा कि क्या यह समस्या थी (मैंने सोचा था कि संश्लेषित किए गए लोगों को कॉल नहीं किया जाएगा/किया जाएगा ChangValueForKey - यह मामला प्रतीत नहीं होता है)। कारण मैं अपना निजी वैरिएबल घोषित करता हूं आदत: मुझे अंडरस्कोर के साथ अपने इवर पसंद हैं और संकलक अंडरस्कोर के बिना उन्हें संश्लेषित करता है। किसी भी मामले में एक नज़र डालने के लिए धन्यवाद। – Mattia

संबंधित मुद्दे