2013-02-07 23 views
5

NSMutableArray documentation के अनुसार:NSMutableArray removeLastObject अपवाद

removeLastObject अगर वहाँ सरणी में कोई वस्तुओं रहे हैं एक NSRangeException को जन्म देती है।

किसी कारण से, मैं इस विधि को खाली सरणी पर कॉल करने में सक्षम हूं, और कोई अपवाद नहीं फेंक दिया गया है।

यहाँ एक परीक्षण का मामला है:

- (void)testNSMutableArray 
{ 
    NSMutableArray* arr = [[NSMutableArray alloc] init]; 
    STAssertTrue([arr count] == 0, @"Array count should be 0"); 
    STAssertThrows([arr removeLastObject], @"Should throw NSRangeException"); 
} 

इस परीक्षण का मामला संदेश के साथ मेरे लिए अंतिम पंक्ति पर विफल रहता है:

[आगमन removeLastObject] उठाया (शून्य)। NSRangeException

क्या मुझे यहां उलझन में डालना चाहिए? क्या दस्तावेज गलत है?

+1

मुझे लगता है कि यह गलत है ... केवल एक चीज जिसे मैं सोच सकता हूं वह यह है कि सरणी शून्य है, लेकिन स्पष्ट रूप से आपने इसे प्रारंभ किया है। – aopsfan

+2

एक दस्तावेज़ बग फ़ाइल करें: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/wa/signIn –

+0

धन्यवाद, मैंने अब एक दस्तावेज़ बग दायर किया है कि जेसी ने नीचे पुष्टि की है। – Zach

उत्तर

5

असेंबली को देखते हुए, ऐसा लगता है कि यह व्यवहार शेर में बदल गया है। यहाँ [__NSArrayM removeLastObject] के कार्यान्वयन के एक हिस्से (वास्तविक क्रियान्वयन आप कॉल कर रहे है) है:

0x3494975a: movs r0, #7 
0x3494975c: bl  0x3490c26c    ; _CFExecutableLinkedOnOrAfter 
0x34949760: cbz r0, 0x3494977c   ; -[__NSArrayM removeLastObject] + 60 

यह 7 के एक मूल्य के साथ CFExecutableLinkedOnOrAfter कॉल; अगर वह 1 लौटाता है (जो यह मेरी मशीन पर करता है), तो आप जो व्यवहार देख रहे हैं उसे प्राप्त करते हैं। यदि यह 0 देता है, तो आपको अपवाद मिलता है।

CFExecutableLinkedOnOrAfter एक गैर-दस्तावेजी समारोह है, लेकिन कुछ snooping around चलता है कि यह वापस लौट आता है निष्पादन योग्य कुछ more snooping पता चलता है कि 7 का मूल्य 10.7 से मेल खाती है मैक ओएस एक्स के एक विशेष संस्करण के बाद जुड़ा हुआ है।

तो, यदि आप शेर या बाद में चल रहे हैं, तो आपको अपवाद नहीं मिलेगा। मुझे एक डॉक्टर बग की तरह लगता है!

+1

भगवान आपको शोध करने के लिए आशीर्वाद देते हैं – Jeremy

1

आप सही हैं, दस्तावेज इस मामले में गलत (या शायद पुराना) लगता है। NSRangeException फेंक दिया जाता है जब हम किसी इंडेक्स I पर किसी ऑब्जेक्ट तक पहुंचने का प्रयास करते हैं, जो सरणी में मौजूद नहीं है। लेकिन [arr removeLastObject] में, मुझे लगता है कि आईओएस स्वचालित रूप से मामले को अनदेखा कर रहा है जब सरणी खाली है

+0

यह समझ में आता है, जैसे सरणी खाली होने पर अपवाद फेंकने के बजाय '- [एनएसएआरएआरए आखिरी ऑब्जेक्ट]' रिटर्न 'शून्य' की तरह। ऐसा लगता है कि प्रलेखन सिर्फ गलत है। –