Thi hành NSJSONSerialization trên json sau đây đôi khi cho tôi NSCFString * và đôi khi NSTaggedPointerString * trên các giá trị chuỗi. Có ai biết tại sao đây là trường hợp và những gì NSJSONSerialization sử dụng để xác định loại nó trả về?NSJSONSerialization tạo NSCFString * và NSTaggedPointerString *
jsonData = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&parseError];
{
"UserPermissionsService": {
"ServiceHeader": {},
"UserApplicationPermissions": {
"ApplicationPermissions": {
"ApplicationID": "TEST",
"Permission": [
{
"Locations": [
"00000"
],
"PermissionID": "LOGIN"
},
{
"Locations": [
"00000"
],
"PermissionID": "SALES_REPORT_VIEW"
}
]
}
}
}
}
"LOGIN" trở lại dưới dạng NSTaggedPointerString *. "SALES_REPORT_VIEW" trở lại là NSCFString *. Đây là một tác động hạ lưu, nơi tôi đang sử dụng và đúc các giá trị.
CẬP NHẬT
Đây là những gì tôi đã học ...
"quả NSTaggedPointerString khi toàn bộ giá trị có thể được lưu giữ trong con trỏ bản thân mà không cần bố trí bất kỳ dữ liệu."
Có một lời giải thích chi tiết ở đây ...
https://www.mikeash.com/pyblog/friday-qa-2015-07-31-tagged-pointer-strings.html
Kể từ NSTaggedPointerString là một lớp con của NSString cho thấy dấu ngoặc kép/dấu ngoặc kép không hiển thị không bao giờ nên là một vấn đề đối với tôi như là dữ liệu được sử dụng.
Cảm ơn mọi người đã nhận xét. Tôi cảm thấy thoải mái Tôi hiểu những gì NSJSONSerialization đang làm.
Bạn đang làm gì mà nó làm cho một sự khác biệt? Bạn luôn nhận được NSString *. Lớp con nào của NSString * không bao giờ quan trọng đối với bạn. – gnasher729
Google cho NSTaggedPointerString. Nếu điều này tạo ra sự khác biệt cho bạn thì bạn đang làm điều gì đó rất, rất sai. Các con trỏ được gắn thẻ rất phổ biến trên các hệ thống 64 bit cho các giá trị nhỏ, nơi toàn bộ giá trị có thể được giữ trong chính con trỏ mà không cần phân bổ bất kỳ dữ liệu nào. – gnasher729
Một ví dụ là khi hiển thị trong giao diện người dùng (được viết cho UITextField) NSTaggedPointerString * không có dấu ngoặc kép xung quanh nó trong khi NSString * không có dấu ngoặc kép xung quanh nó. –