2012-01-11 8 views

उत्तर

12

के साथ वस्तु के प्रकार के संकेत हो सकता है विवरण

समस्या यह है कि संकलक tag नामक एक से अधिक विधि देखता है ई वर्तमान अनुवाद इकाई, और इन घोषणाओं में अलग-अलग रिटर्न प्रकार हैं। एक -[UIView tag] होने की संभावना है, जो NSInteger देता है। लेकिन यह भी tag का एक और घोषणा, शायद देखा है:

@interface MONDate 
- (NSString *)tag; 
@end 

तो संकलक एक अस्पष्टता को देखता है - sender एक UIView है? या यह MONDate है?

कंपाइलर की चेतावनी आपको यह है कि अनुमानsender का प्रकार क्या है। यह वास्तव में अपरिभाषित व्यवहार के लिए पूछ रहा है।

संकल्प

आप पैरामीटर के प्रकार पता है, तो यह निर्दिष्ट करें:

बाकी

, कुछ इस तरह का उपयोग एक isKindOfClass: शर्त के रूप में प्रकार निर्धारित करने के लिए यह संदेश पहले की तरह चर घोषित करने के लिए । जैसा कि अन्य उत्तरों दिखाते हैं, आप टाइपकास्ट भी कर सकते हैं।

+1

+1 बहुत अच्छी तरह से समझाया। लेकिन चेतावनी के बावजूद, इसे किसी भी मामले (आईडी का उपयोग करके) में काम करना चाहिए .. सही? –

+0

@ एंकिट यह * काम नहीं करेगा (रेफरी: यह अपरिभाषित व्यवहार के लिए पूछ रहा है)। यदि सभी दृश्यमान 'टैग' विधियां एक ओबीजेसी ऑब्जेक्ट लौटाती हैं, तो यह अनुमान लगाया जा सकता है। यदि कोई 'CGRect' और दूसरा एक objc ऑब्जेक्ट देता है, तो संकलक गलत' objc_msgSend' संस्करण को कॉल कर सकता है जिसे आप अपने ढेर के हिस्से को तोड़ सकते हैं। यदि संकलक दूसरे तरीके से अनुमान लगाता है और गलत है, तो 'CGRect' को objc ऑब्जेक्ट के रूप में मैसेज किया जा सकता है। आप स्मृति को टुकड़ा भी कर सकते हैं, और यदि सी ++ वहां है, तो यह और भी जटिल है। (cont) – justin

+0

(cont) विकल्प उत्पन्न प्रत्येक चेतावनी के लिए उत्पन्न असेंबली को देखना होगा। इससे खराब और क्या होगा? यदि आपने टीयू में 'प्रेषक' के रूप में पारित वस्तु के प्रकार को शामिल नहीं किया है तो आपको चेतावनी नहीं मिल सकती है। – justin

3

समस्या यह है कि sender एक (id) वस्तु के रूप में परिभाषित किया गया है है। संकलन समय पर xcode नहीं जानता कि आपके फ़ंक्शन में किस तरह की ऑब्जेक्ट्स पास की जाएंगी।

आप एक विशिष्ट वस्तु प्रकार के लिए इस समारोह लिखने हैं, तो आप आप उदाहरण

- (IBAction)shareThisActionSheet:(UIButton*)sender 

के लिए लिख सकता है या आप संकलक कॉल

int row = [(UIButton*)sender tag]; 
2

Bastian सही है आप इस तरह बटन के लिए अपने इस परिवर्तित करना चाहिए:

UIButton * button = (UIButton *)sender; 
int row = button.tag; 
+3

यदि आपको लगता है कि मैं सही हूं, तो आप मेरा जवाब देने के बजाय एक ही उत्तर क्यों पोस्ट करते हैं? – Bastian

+1

क्योंकि मैंने प्रेषक का थोड़ा अलग कास्टिंग पोस्ट किया है (मुझे लगता है कि यह अधिक सही है क्योंकि यह अधिक दृश्यमान है) – Stas

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