"'NSString *' को 'NSString *' के पैरामीटर के लिए 'const NSString *' भेजना" चेतावनी देता है "चेतावनी


353

मेरे पास लगातार NSString है, जिसे मैं कॉल करना चाहता हूं:

[newString isEqualToString:CONSTANT_STRING];

यहाँ कोई गलत कोड?

मुझे यह चेतावनी मिली:

'' NSString * '' को 'NSString *' के पैरामीटर पर 'const NSString *' भेजने से क्वालिफायर छूट जाता है

इन्हें कैसे घोषित किया जाना चाहिए?


2
इन तारों को कैसे परिभाषित किया जाता है?

जवाबों:


916

आपको अपनी निरंतर स्ट्रिंग इस प्रकार घोषित करनी चाहिए:

NSString * const kSomeConstantString = @""; // constant pointer

के बजाय:

const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";

पूर्व NSStringवस्तु के लिए एक स्थिर सूचक है , जबकि उत्तरार्द्ध किसी स्थिर NSStringवस्तु का सूचक है ।

एक का उपयोग करते हुए NSString * constएक अलग करने के लिए बात करने के लिए kSomeConstantString फिर नियत करने से रोकता है आप NSStringवस्तु।

विधि isEqualToString:प्रकार के एक तर्क की उम्मीद करती है NSString *। यदि आप एक निरंतर स्ट्रिंग ( const NSString *) को पॉइंटर पास करते हैं, तो आप अपेक्षा करते हैं कि आप कुछ अलग कर रहे हैं।

इसके अलावा, NSStringऑब्जेक्ट पहले से ही अपरिवर्तनीय हैं, इसलिए उन्हें बनाना const NSStringअर्थहीन है।


3
आपने कहा कि पूर्व NSString ऑब्जेक्ट के लिए निरंतर सूचक है। तो इसका मतलब है कि सूचक स्थिर है। इसलिए मैं दूसरे NSString को फिर से असाइन नहीं कर सकता।
user4951

8
काश मैं तुम्हें दस अपवित्र दे पाता! आपके समझने योग्य और बहुत उपयोगी उत्तर के लिए धन्यवाद!
कांस्टेंटिनो त्सारोहस

1
कैसे पृथ्वी में NSString * कॉन्स्टेंस NSString के लिए एक कॉन्स्टेंट पॉइंटर है? उनका संदर्भ मुक्त व्याकरण जनरेटर क्या है?
user4951

3
@ समस्या यह है कि आप सी को ठीक से नहीं सीख रहे हैं, इसे दूसरों पर दोष न दें। constक्वालीफायर अपनी बाईं तरफ के कार्यकाल के लिए लागू होता है, और वह अपने अधिकार पर अवधि अपनी बाईं ओर (जैसे पर कुछ भी नहीं है केवल तभी लागू होता है const char *और एक char const *स्थिरांक चार करने के लिए गैर स्थिरांक संकेत दिए गए हैं, लेकिन char *constगैर स्थिरांक चार करने के लिए एक स्थिरांक सूचक है )।

8
+1। और +1000 के लिए "इसके अलावा, NSString ऑब्जेक्ट पहले से ही अपरिवर्तनीय हैं, इसलिए उन्हें NSString बनाना अर्थहीन है।"
मैडब्रेक्स

6

बस सभी को एक जगह पर रखने के लिए जो स्टैकओवरफ्लो पर विभिन्न पोस्ट पर पाया गया और मेरे लिए काम करता है, #define खराब है क्योंकि आप वेरिएबल प्रकारों से लाभ नहीं उठा सकते हैं, मूल रूप से कंपाइलर सभी घटनाओं की जगह लेता है जब कंपाइल आयात करता है (जब भी आपको आवश्यकता होती है तो आयात करें:

//  Constants.h
#import <Foundation/Foundation.h>

@interface Constants : NSObject

extern NSString *APP_STATE_LOGGED_IN;
extern NSString *APP_STATE_LOGGED_OUT;
@end

// Constants.m
#import <Foundation/Foundation.h>
#import "Constants.h"

@implementation Constants

NSString *APP_STATE_LOGGED_IN  = @"APP_STATE_LOGGED_IN";
NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT";
@end

5

इसे पढ़ने के लिए कुछ मिनटों का समय दें। स्थिरांक और इसके विपरीत बिंदुओं पर नरक का एक अच्छाई।

http://c-faq.com/decl/spiral.anderson.html

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