2015-10-13 12 views
14

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.

+1

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

+2

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

+0

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ó. –

Trả lời

0

Nhiều nền tảng được triển khai dưới dạng class clusters. TL; DR bạn tương tác với nó như là một NSString nhưng nền tảng sẽ thay đổi việc thực hiện sao lưu để tối ưu hóa cho một số đặc tính hiệu suất hoặc không gian dựa trên nội dung thực tế.

Nếu bạn tò mò một trong những đội Foundation đổ một danh sách các cụm lớp như iOS 11 here

Các vấn đề liên quan