tại sao tôi nhận được cảnh báo này trong mã của tôi dưới đây:Nhiều phương pháp có tên là 'từ khóa' tìm thấy
- (IBAction)shareThisActionSheet:(id)sender
{
int row = [sender tag]; //warning is here! Multiple methods named 'tag' found
...
tại sao tôi nhận được cảnh báo này trong mã của tôi dưới đây:Nhiều phương pháp có tên là 'từ khóa' tìm thấy
- (IBAction)shareThisActionSheet:(id)sender
{
int row = [sender tag]; //warning is here! Multiple methods named 'tag' found
...
Mô tả
Vấn đề là trình biên dịch nhìn thấy nhiều phương pháp có tên là tag
trong th e đơn vị dịch hiện tại và các khai báo này có các loại trả về khác nhau. Một người có thể là -[UIView tag]
, trả về một số NSInteger
. Nhưng nó cũng nhìn thấy một tuyên bố tag
, có lẽ:
@interface MONDate
- (NSString *)tag;
@end
sau đó trình biên dịch thấy một sự mơ hồ - là sender
một UIView
? hoặc là một MONDate
?
Trình biên dịch cảnh báo bạn rằng cần phải đoán loại của sender
là gì. Đó là thực sự yêu cầu cho hành vi không xác định.
Nghị quyết
Nếu bạn biết kiểu của tham số, sau đó xác định nó:
khác, sử dụng một cái gì đó như một điều kiện isKindOfClass:
để xác định loại để khai báo biến như trước gửi tin nhắn nó . như các câu trả lời khác cho thấy, bạn cũng có thể định kiểu.
Vấn đề là sender
được định nghĩa là một đối tượng (id)
. Tại thời gian biên dịch xcode không biết loại đối tượng nào sẽ được truyền cho hàm của bạn.
Nếu bạn viết chức năng này cho một loại đối tượng cụ thể, bạn có thể giúp bạn có thể viết ví dụ
- (IBAction)shareThisActionSheet:(UIButton*)sender
hoặc bạn có thể gợi ý các trình biên dịch các loại đối tượng với các cuộc gọi
int row = [(UIButton*)sender tag];
Bastian là đúng bạn nên chuyển đổi người gửi của bạn để nút như thế này:
UIButton * button = (UIButton *)sender;
int row = button.tag;
+1 giải thích rất rõ. Nhưng nó sẽ làm việc trong mọi trường hợp (sử dụng id), mặc dù cảnh báo .. phải không? –
@Ankit Nó * sẽ không * làm việc (ref: nó yêu cầu cho hành vi không xác định). Nếu tất cả các phương thức 'tag' có thể nhìn thấy trả về một đối tượng objc, thì nó có thể dự đoán được. Nếu một trả về một 'CGRect' và một đối tượng objc khác, trình biên dịch có thể kết thúc gọi nhầm biến' objc_msgSend' mà bạn có thể đập vỡ một phần của ngăn xếp của bạn. Nếu trình biên dịch đoán theo cách khác và sai, 'CGRect' có thể được gửi đi như một đối tượng objc. Bạn cũng có thể cắt bộ nhớ, và nếu C++ ở trong đó, nó thậm chí còn phức tạp hơn. (tiếp theo) – justin
(tiếp) Cách khác là xem xét lắp ráp được tạo ra, cho mỗi cảnh báo được tạo ra. Cái gì tệ hơn? Bạn có thể không nhận được cảnh báo nếu bạn không #included loại đối tượng được chuyển thành 'người gửi' trong TU. – justin