2012-03-19 23 views
5

Xin chào các bạn, tôi nhận mã này và XCode cảnh báo tôi về "kiểu con trỏ không tương thích khởi tạo NSString * __ mạnh với biểu thức loại UITextField".Cảnh báo - kiểu con trỏ không tương thích khởi tạo 'NSString * __ strong' với biểu thức kiểu 'UITextField'

NSString *name = (UITextField *)searchText.text; 

nhưng điều này là tốt

NSString *name2 = [(UITextField *)searchText text]; 

và điều này là tốt quá

NSString *name3 = [(UITextField *)searchText.text mutableCopy]; 

Tôi có hai câu hỏi:

  1. Tôi lẫn lộn với obj.*[obj *]
  2. Tại sao "mutableCopy" chính xác là trường hợp này?

Tôi không biết cách tìm kiếm trong tài liệu dành cho nhà phát triển của Apple cho những câu hỏi này; Hãy giúp tôi.

Trả lời

8

Trong phiên bản đầu tiên, do ưu tiên toán tử, bạn đang truyền searchText.text đến UITextField*, những gì bạn muốn làm có thể là dùng searchText;

NSString *name = ((UITextField *)searchText).text; 

Trong phiên bản thứ hai bạn không có dấu chấm, vì vậy trình biên dịch hiểu dàn diễn viên của bạn sẽ được đúc searchText để UITextField và gửi tin nhắn văn bản với nó. Nói cách khác, chính xác.

Trường hợp cuối cùng hơi phức tạp vì nó liên quan đến cả thời gian chạy và thời gian biên dịch. Như tôi hiểu nó;

  • Bạn truyền searchText.text đến UITextField*. Thời gian chạy vẫn biết rằng đối tượng là một NSString và thông báo mutableCopy tồn tại trên cả hai sẽ đi đến phương pháp chính xác [NSString mutableCopy] anyway và tạo/trả về một bản sao có thể thay đổi của NSString để thời gian chạy nó hoạt động tốt.
  • Kể từ mutableCopy trả về id (tham chiếu NSMutableString), gán cho một NSString là ok bởi trình biên dịch (id có thể được gán cho bất cứ điều gì), do đó, thời gian biên dịch là ok.

Câu hỏi, searchText là gì? Phiên bản cuối cùng được biên dịch mà không có cảnh báo cho biết rằng nó đã là UITextField* hoặc ít nhất một loại có thể nhận được thông báo text. Nếu vậy, bạn sẽ có thể làm được;

NSString *name3 = [searchText.text mutableCopy]; 
1

Trong ví dụ thứ hai và thứ ba, diễn viên chỉ hoạt động trên searchText. Vì vậy, với những bạn đang gửi một tin nhắn đến một đối tượng UITextField.

Trong trường hợp đầu tiên, dàn diễn viên áp dụng cho toàn bộ searchText.text. Việc gán một đối tượng UITextField cho một biến NSString không phải là những gì bạn muốn. Mã bạn đang muốn tìm:

NSString *name = ((UITextField *)searchText).text; 

Thông điệp mutableCopy trả về một bản sao của chuỗi của bạn như là một đối tượng NSMutableString, có thể được gán cho một NSString như NSMutableString bắt nguồn từ nó.Trong trường hợp này, việc sử dụng thông điệp 'copy' chỉ là tốt.

Hy vọng điều đó sẽ hữu ích.

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