"отправка" const NSString * 'в параметр типа "NSString *" отбрасывает квалификаторы "предупреждение

У меня есть константа NSString, которую я хочу вызвать как:

[newString isEqualToString:CONSTANT_STRING];

Какой-либо неправильный код здесь?

Я получил это предупреждение:

отправка 'const NSString *' в параметр типа 'NSString *' отбрасывает квалификаторы

Как они должны быть объявлены?

Ответ 1

Вы должны объявить свою постоянную строку следующим образом:

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 бессмысленными.

Ответ 2

просто чтобы поместить все на одно место, которое было найдено на разных постах в stackoverflow и работает для меня, #define плохо, потому что вы не можете использовать переменные типы, в основном компилятор заменяет все возникновение при компиляции (импортируйте Constants.h всякий раз, когда вам нужно ):

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

Ответ 3

Сэкономьте несколько минут, чтобы прочитать это. Хороший пример для указателей на константы и наоборот.

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