2012-04-19 41 views
9

Tôi tuyên bố các biến đối tượng như một NSString Nhưng khi tôi sử dụng XCode để nhìn vào đối tượng của tôi, tôi thấy có hai loại String, có vẻ như hệ thống tự động chuyển sang khác:Sự khác nhau giữa NSCFString và NSConstantString là gì?

enter image description here

Sự khác nhau giữa chúng là gì? Họ có thể hoán đổi cho nhau và một người khác không. Ngoài ra, tình trạng này thay đổi như thế nào?

Cảm ơn.

+0

Tôi quan sát __NSCFConstantString trong trình gỡ rối Xcode cho biến UILabel khi tôi gán NSString * vào UILabel * do tai nạn – sergtk

Trả lời

12

Cả hai đều là lớp con cụ thể của NSString. __NSCFString là một được tạo trong thời gian chạy qua Foundation hoặc Core Foundation, trong khi __NSCFConstantString là hằng số CFSTR("...") hoặc hằng số @"...", được tạo tại thời gian biên dịch.

Giao diện của họ là riêng tư. Hãy đối xử với họ như là NSString và bạn sẽ không gặp khó khăn gì.

+8

Bạn sẽ gặp rắc rối nếu bạn thử so sánh hai đối tượng với isKindOfClass: nó sẽ chỉ hoạt động nếu __NSCFConstantString là người nhận. Chỉ cần một người đứng đầu lên đến bất cứ ai muốn biết một trong những sự tinh tế mà điều này ngụ ý. – fjlksahfob

+0

'-isKindOfClass:' không được sử dụng để so sánh đối tượng, vì vậy tôi không chắc chắn cụ thể những gì bạn đang nhận được ở đây. –

+2

tôi cũng sử dụng nó vì vậy nó đã giúp –

2

Theo như tôi biết, NSCFConstantString là việc triển khai NSString để giữ dữ liệu chuỗi trong bộ nhớ mã. Trình biên dịch tạo ra các thể hiện của nó khi bạn sử dụng hằng số @"string". Bạn có thể sử dụng NSCFConstantString ở bất kỳ nơi nào có thể sử dụng NSString do mối quan hệ lớp con/siêu lớp, nhưng rõ ràng không phải là cách khác.

3

Dường như trình tối ưu hóa được thực hiện bởi trình biên dịch. Tôi đoán rằng chuỗi đó là nhận được chuyển đổi sang một NSCFConstantString bằng một trong các hằng số được lưu trữ vì lý do hiệu suất. NSCFString của bạn chỉ là một chuỗi cầu nối miễn phí có thể là NSString hoặc CFString. Xem this article để biết thêm thông tin.

0

Một trong những lợi ích của việc chuyển NSString để NSCFConstantString là ví dụ tiếp theo:

Ví dụ - trong phương pháp cellForRowAtIndexPath cho tableView nếu bạn sẽ viết

NSString *ident = @"identificator"; 
NSLog(@"%p", ident); 

hơn nó sẽ là địa chỉ tương tự cho mỗi tế bào. Nhưng với NSLog (@ "% p", & ident) nó sẽ là địa chỉ khác nhau cho mỗi ô.

NSString ident = @ "identificator" là một trường hợp đặc biệt - nó được tạo ra như là một lớp __NSCFConstantString vì vậy tất cả xâu bằng sẽ chia sẻ địa chỉ bộ nhớ tương tự để tối ưu hóa việc sử dụng bộ nhớ. & ident sẽ nhận được một địa chỉ của biến cục bộ trỏ đến một NSString và sẽ có loại NSString **.

Reference vào nguồn (nhận xét).

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