लघु जवाब: पैरामीटर आईओएस 10 में ब्लॉक के कार्यान्वयन में नहीं किया जाता है (लगता है कि आईओएस 9 भी, लेकिन में नहीं कर सकते अभी जांचें)।
लांग जवाब: चलो देखते हैं कि क्या completion
ब्लॉक के अंदर होता है:
___50-[UIApplication _handleApplicationShortcutAction:]_block_invoke:
push rbp ; XREF=-[UIApplication _handleApplicationShortcutAction:]+132
mov rbp, rsp
mov rax, qword [ds:rdi+0x20]
mov rdx, qword [ds:rdi+0x28]
mov rsi, qword [ds:0x1179e88] ; @selector(_updateSnapshotAndStateRestorationWithAction:)
mov rdi, rax ; argument "instance" for method imp___got__objc_msgSend
pop rbp
jmp qword [ds:imp___got__objc_msgSend]
; endp
मैं Intel64 पर इस चलाते हैं, तो पहला तर्क rdi
रजिस्टर में संग्रहित किया जाना चाहिए (जब हम एआरसी के तहत ब्लॉक बुला यह एक है NSMallocBlock
का उदाहरण)। कोई चयनकर्ता नहीं है, इसलिए दूसरा पैरामीटर (बूल तर्क) rsi
रजिस्टर में संग्रहीत किया जाना चाहिए। लेकिन कोड में rsi
रजिस्टर का उपयोग नहीं किया जाता है - यह _updateSnapshotAndStateRestorationWithAction:
पर संदेश ds:rdi+0x20
पर ds:rdi+0x28
तर्क के साथ संदेश भेजता है।
ds:rdi+0x20
और ds:rdi+0x28
दोनों ब्लॉक के अंदर पॉइंटर्स पर कब्जा कर रहे हैं।
सोचें कि स्नैपशॉट फ़ंक्शन के लिए पैरामीटर के रूप में पैरामीटर के साथ अनुमान गलत था।
स्रोत
2016-09-26 18:35:04
क्या आप डॉक्टर के माध्यम से गए हैं? [आवेदन: performActionForShortcutItem: completHandler] (https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622935- appplication?language=objc) –
@AdilSoomro हाँ, मेरे पास है। क्या तुम? – matt
मैं गलत हो सकता हूं लेकिन मुझे लगता है कि आप विधि के कार्यान्वयन के लिए ज़िम्मेदार हैं और इस तरह की विधि को सशर्त रूप से कॉल करने के लिए ज़िम्मेदार भी हैं, इस मामले में आप 'समापन हैंडलर' (लागू करने की आपकी ज़िम्मेदारी भी) पास कर सकते हैं, इसलिए ' आवेदन (_: performActionFor: completHandler:) 'आप एक बूल पास कर सकते हैं जो कि' completHandler' पर लागू तर्क को समझ सकता है और जो आप बनाना चाहते हैं उसके डिज़ाइन पर निर्भर है। –