369 Stimmen

"Senden von 'const NSString *' an einen Parameter des Typs 'NSString *' verwirft Qualifier" Warnung

Ich habe Konstanten NSString, die ich wie aufrufen möchte:

[newString isEqualToString:CONSTANT_STRING];

Gibt es hier einen falschen Code?

Ich habe diese Warnung erhalten:

Senden von 'const NSString *' an Parameter des Typs 'NSString *' verwirft Qualifier

Wie sollten diese angegeben werden?

958voto

albertamg Punkte 28422

Sie sollten Ihre konstante Zeichenfolge wie folgt deklarieren:

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

anstelle von:

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

Ersteres ist ein konstanter Zeiger auf eine NSString Objekt, während letzteres ein Zeiger auf eine Konstante ist NSString Objekt.

Mit einer NSString * const verhindert, dass Sie kSomeConstantString neu zuweisen können, um auf einen anderen NSString Objekt.

Die Methode isEqualToString: erwartet ein Argument vom Typ NSString * . Wenn Sie einen Zeiger auf eine konstante Zeichenkette übergeben ( const NSString * ), übergeben Sie etwas anderes, als es erwartet.

Außerdem, NSString Objekte sind bereits unveränderlich, so dass sie const NSString ist bedeutungslos.

6voto

freezing_ Punkte 854

Nur um alle auf einem Platz zu setzen, die auf verschiedenen Post auf Stackoverflow gefunden und funktioniert für mich, #define ist schlecht, weil Sie nicht von variablen Typen profitieren können, im Grunde der Compiler ersetzt alle Vorkommen, wenn kompiliert (importieren Constants.h wann immer Sie benötigen) :

//  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

6voto

Ein paar Minuten Zeit, um dies zu lesen. Ein goodread auf Zeiger Hölle auf Konstanten und umgekehrt.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X