Gửi tin nhắn 'const NSString *' đến tham số loại 'NSString *' loại bỏ cảnh báo


353

Tôi có hằng số NSString mà tôi muốn gọi như:

[newString isEqualToString:CONSTANT_STRING];

Có mã nào sai ở đây không?

Tôi đã nhận được cảnh báo này:

gửi 'const NSString *' đến tham số loại 'NSString *' loại bỏ vòng loại

Làm thế nào những điều này nên được tuyên bố?


2
những chuỗi này được định nghĩa như thế nào?

Câu trả lời:


917

Bạn nên khai báo chuỗi hằng của bạn như sau:

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

thay vì:

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

Cái trước là một con trỏ không đổi đến một NSStringđối tượng, trong khi cái sau là con trỏ tới một NSStringđối tượng không đổi .

Việc sử dụng NSString * constngăn không cho bạn gán lại kSomeConstantString để trỏ đến một NSStringđối tượng khác .

Phương thức này isEqualToString:dự kiến ​​một đối số của kiểu NSString *. Nếu bạn chuyển một con trỏ tới một chuỗi không đổi ( const NSString *), bạn đang truyền một cái gì đó khác với mong đợi.

Bên cạnh đó, NSStringcác đối tượng đã là bất biến, vì vậy làm cho chúng const NSStringlà vô nghĩa.


3
Bạn đã nói trước đây là con trỏ liên tục đến một đối tượng NSString. Vì vậy, điều đó có nghĩa là con trỏ không đổi. Do đó tôi không thể gán lại cho NSString khác.
dùng4951

8
Tôi ước tôi có thể cung cấp cho bạn mười upvote! Cảm ơn bạn đã trả lời dễ hiểu và rất hữu ích của bạn!
Constantino Tsarouhas

1
Làm thế nào trong trái đất NSString * const là một con trỏ const cho NSString? Trình tạo ngữ pháp miễn phí ngữ cảnh của họ là gì?
dùng4951

3
@Jim vấn đề là ở bạn không học C đúng cách, đừng đổ lỗi cho người khác. Vòng constloại áp dụng cho thuật ngữ ở bên trái và nó chỉ áp dụng cho thuật ngữ ở bên phải nếu không có gì ở bên trái của nó (ví dụ: const char *char const *không phải char *constlà con trỏ không phải là const ).

8
+1. Và +1000 cho "Bên cạnh đó, các đối tượng NSString đã không thay đổi, do đó, biến chúng thành NSString là vô nghĩa."
Madbreaks

6

chỉ để đặt tất cả vào một nơi được tìm thấy trên nhiều bài đăng khác nhau trên stackoverflow và hoạt động với tôi, #define rất tệ vì bạn không thể hưởng lợi từ các loại biến, về cơ bản trình biên dịch sẽ thay thế tất cả các lần xuất hiện khi biên dịch (nhập Constants.h bất cứ khi nào bạn cần):

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.