Mac पर ARC का उपयोग करके उत्तर नहीं दिया जा सकता है


83

जब मैं respondsToSelectorARC वातावरण में कॉल करता हूं , तो मुझे निम्न त्रुटि संदेश मिलता हैAutomatic Reference Counting Issue No known instance method for selector respondsToSelector:

यह हैडर है

#import <AppKit/AppKit.h>


@class MTScrollView;

@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end


@interface MTScrollView : NSScrollView 
{

}

@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;

@end

यह कार्यान्वयन फ़ाइल है

#import "MTScrollView.h"

@implementation MTScrollView

@synthesize delegate;


- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
    [super reflectScrolledClipView:aClipView];

    if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
    {
        [delegate scrollViewDidScroll:self];
    }
}

@end

मुझे यह त्रुटि क्यों हो रही है, इस पर कोई सुझाव?

जवाबों:


276

प्रोटोकॉल NSObject के अनुरूप बनाएं

@protocol MTScrollViewDelegate <NSObject>

अन्यथा कंपाइलर यह नहीं सोचता है कि ऑब्जेक्ट NSObject जैसे संदेशों का जवाब देगा respondsToSelector, और एक चेतावनी उत्पन्न करेगा। यह किसी भी तरह से मुद्दों के बिना रनटाइम पर सफल होगा।


2
@piobyz, respondsToSelectorएक उदाहरण विधि है, NSObjectइसलिए सिस्टम को यह जानना होगा कि प्रतिनिधि कुछ उपवर्गों में से हैNSObject
डेविड

1
@ डेविड धन्यवाद, आप सही कह रहे हैं, इसके अतिरिक्त यहाँ कुछ और जानकारी है: stackoverflow.com/questions/1304176/…
Piotr Byzia

2
ARC से पहले "पुरानी दुनिया" में @piobyz संकलक ने माना कि आप जानते हैं कि आप क्या कर रहे हैं और बस संकलन समय पर कुछ सामान को नजरअंदाज कर दिया। अब ARC आपके लिए रिटेन और रिलीज का प्रबंधन करता है। यह सुनिश्चित करने में सक्षम होने के लिए कि एक विधि मौजूद है, विधि को आपकी परियोजना में पाया जाना चाहिए। आईडी के साथ काम करते समय संकलक को कोई प्रतीक नहीं मिल सकता है। NSObject ARC में प्रोटोकॉल को प्रतिबंधित करके, वास्तव में जानता है कि किसी भी संभावित प्रतिनिधि के पास "respondsToSelector" होगा। यह स्थिरता सुनिश्चित करता है और आपका मेमोरी मैनेजमेंट हमेशा ठीक रहेगा। जो कक्षाएं NSObject से मेल नहीं खा रही हैं, यदि प्रतिनिधि के रूप में उपयोग की जाती हैं, तो एक त्रुटि होगी।
जैकपियर

1
@piobyz: क्योंकि respondsToSelector:NSObject प्रोटोकॉल का हिस्सा है। delegateसंपत्ति घोषित रूप में किया जाता है id <MTScrollViewDelegate>, जो कहते हैं कि केवल संदेशों के लिए प्रतिनिधि जवाब देता है कि प्रोटोकॉल में घोषित कर दिया। इस प्रकार, आपको संकलक के लिए NSObject प्रोटोकॉल के अनुरूप होने के लिए उस प्रोटोकॉल की आवश्यकता है जो कि respondsToSelector:उनमें से एक है।
पीटर होसी

1
@ डेविड: बिलकुल नहीं। delegateएक वर्ग के नाम के साथ घोषित नहीं किया जाता है, इसलिए NSObject वर्ग यहां प्रासंगिक नहीं है - संकलक नहीं करता है, और अभी भी नहीं जानता है कि उन दो चीजों से संबंधित हैं। "NSObject" जो समाधान का हिस्सा है, NSObject प्रोटोकॉल है , क्योंकि यही वह जगह respondsToSelector:है जहाँ घोषित किया गया है। developer.apple.com/library/mac/documentation/Cocoa/Reference/…
पीटर होसी

4

स्विफ्ट के लिए यह बन जाता है:

@objc protocol MTScrollViewDelegate: NSObjectProtocol

NSObject प्रोटोकॉल समूह विधियाँ जो सभी Object-C ऑब्जेक्ट्स के लिए मूलभूत हैं।

NSObjectProtocol के बारे में अधिक जानकारी के लिए: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol_index.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.