Die Warnung "Senden von 'const NSString *' an Parameter vom Typ 'NSString *' verwirft Qualifizierer"

353

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

[newString isEqualToString:CONSTANT_STRING];

Irgendein falscher Code hier?

Ich habe diese Warnung erhalten:

Durch das Senden von 'const NSString *' an einen Parameter vom Typ 'NSString *' werden Qualifizierer verworfen

Wie sollen diese deklariert werden?

user4951
quelle
2
Wie sind diese Zeichenfolgen definiert?

Antworten:

917

Sie sollten Ihre konstante Zeichenfolge wie folgt deklarieren:

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

anstatt:

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

Ersteres ist ein konstanter Zeiger auf ein NSStringObjekt, während letzteres ein Zeiger auf ein konstantes NSStringObjekt ist.

Die Verwendung von a NSString * constverhindert, dass Sie kSomeConstantString neu zuweisen, um auf ein anderes NSStringObjekt zu verweisen .

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

Außerdem sind NSStringObjekte bereits unveränderlich, so dass const NSStringes bedeutungslos ist, sie herzustellen.

albertamg
quelle
3
Sie sagten, ersteres ist der konstante Zeiger auf ein NSString-Objekt. Das heißt, der Zeiger ist konstant. Daher kann ich das keinem anderen NSString zuordnen.
user4951
8
Ich wünschte, ich könnte dir zehn Gegenstimmen geben! Vielen Dank für Ihre verständliche und sehr hilfreiche Antwort!
Constantino Tsarouhas
1
Wie in aller Welt ist NSString * const ein const-Zeiger auf NSString? Was ist ihr kontextfreier Grammatikgenerator?
user4951
3
@ Jim das Problem ist, dass du C nicht richtig gelernt hast, beschuldige andere nicht. Das constQualifikationsmerkmal gilt für den Begriff auf der linken Seite und nur dann für den Begriff auf der rechten Seite, wenn sich auf der linken Seite nichts befindet (z. B. const char *und a char const *sind nicht konstante Zeiger auf const char, sondern char *constein konstanter Zeiger auf nicht konstante Zeichen ).
8
+1. Und +1000 für "Außerdem sind NSString-Objekte bereits unveränderlich, sodass es bedeutungslos ist, sie als konstante NSString-Objekte zu definieren."
Madbreaks
6

#define ist schlecht, weil Sie nicht von Variablentypen profitieren können. Grundsätzlich ersetzt der Compiler alle Vorkommen beim Kompilieren (importieren Sie Constants.h, wann immer Sie es 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
Einfrieren_
quelle