कारण है कि मैं नीचे मेरी कोड में इस चेतावनी को मिलता है:एकाधिक 'टैग' नाम दिया तरीकों पाया
- (IBAction)shareThisActionSheet:(id)sender
{
int row = [sender tag]; //warning is here! Multiple methods named 'tag' found
...
कारण है कि मैं नीचे मेरी कोड में इस चेतावनी को मिलता है:एकाधिक 'टैग' नाम दिया तरीकों पाया
- (IBAction)shareThisActionSheet:(id)sender
{
int row = [sender tag]; //warning is here! Multiple methods named 'tag' found
...
के साथ वस्तु के प्रकार के संकेत हो सकता है विवरण
समस्या यह है कि संकलक tag
नामक एक से अधिक विधि देखता है ई वर्तमान अनुवाद इकाई, और इन घोषणाओं में अलग-अलग रिटर्न प्रकार हैं। एक -[UIView tag]
होने की संभावना है, जो NSInteger
देता है। लेकिन यह भी tag
का एक और घोषणा, शायद देखा है:
@interface MONDate
- (NSString *)tag;
@end
तो संकलक एक अस्पष्टता को देखता है - sender
एक UIView
है? या यह MONDate
है?
कंपाइलर की चेतावनी आपको यह है कि अनुमानsender
का प्रकार क्या है। यह वास्तव में अपरिभाषित व्यवहार के लिए पूछ रहा है।
संकल्प
आप पैरामीटर के प्रकार पता है, तो यह निर्दिष्ट करें:
बाकी, कुछ इस तरह का उपयोग एक isKindOfClass:
शर्त के रूप में प्रकार निर्धारित करने के लिए यह संदेश पहले की तरह चर घोषित करने के लिए । जैसा कि अन्य उत्तरों दिखाते हैं, आप टाइपकास्ट भी कर सकते हैं।
समस्या यह है कि sender
एक (id)
वस्तु के रूप में परिभाषित किया गया है है। संकलन समय पर xcode नहीं जानता कि आपके फ़ंक्शन में किस तरह की ऑब्जेक्ट्स पास की जाएंगी।
आप एक विशिष्ट वस्तु प्रकार के लिए इस समारोह लिखने हैं, तो आप आप उदाहरण
- (IBAction)shareThisActionSheet:(UIButton*)sender
के लिए लिख सकता है या आप संकलक कॉल
int row = [(UIButton*)sender tag];
Bastian सही है आप इस तरह बटन के लिए अपने इस परिवर्तित करना चाहिए:
UIButton * button = (UIButton *)sender;
int row = button.tag;
+1 बहुत अच्छी तरह से समझाया। लेकिन चेतावनी के बावजूद, इसे किसी भी मामले (आईडी का उपयोग करके) में काम करना चाहिए .. सही? –
@ एंकिट यह * काम नहीं करेगा (रेफरी: यह अपरिभाषित व्यवहार के लिए पूछ रहा है)। यदि सभी दृश्यमान 'टैग' विधियां एक ओबीजेसी ऑब्जेक्ट लौटाती हैं, तो यह अनुमान लगाया जा सकता है। यदि कोई 'CGRect' और दूसरा एक objc ऑब्जेक्ट देता है, तो संकलक गलत' objc_msgSend' संस्करण को कॉल कर सकता है जिसे आप अपने ढेर के हिस्से को तोड़ सकते हैं। यदि संकलक दूसरे तरीके से अनुमान लगाता है और गलत है, तो 'CGRect' को objc ऑब्जेक्ट के रूप में मैसेज किया जा सकता है। आप स्मृति को टुकड़ा भी कर सकते हैं, और यदि सी ++ वहां है, तो यह और भी जटिल है। (cont) – justin
(cont) विकल्प उत्पन्न प्रत्येक चेतावनी के लिए उत्पन्न असेंबली को देखना होगा। इससे खराब और क्या होगा? यदि आपने टीयू में 'प्रेषक' के रूप में पारित वस्तु के प्रकार को शामिल नहीं किया है तो आपको चेतावनी नहीं मिल सकती है। – justin