2010-03-02 22 views
6

Tôi có một lớp sử dụng resolveInstanceMethod để tự động triển khai các phương pháp. Khi tôi gọi các phương thức được triển khai động từ các phần khác của mã, trình biên dịch phát ra cảnh báo rằng đối tượng đó có thể không phản hồi với bộ chọn. Tôi muốn trình biên dịch không phát ra các cảnh báo như vậy cho lớp này, nhưng tôi không muốn chặn các cảnh báo khi tôi gọi một bộ chọn không hợp lệ trên các lớp khác. Điều này có thể không?Làm thế nào tôi có thể nói với trình biên dịch rằng lớp của tôi giải quyết các phương thức động?

Trả lời

7

Giả sử bạn biết chữ ký phương pháp đó sẽ được tự động giải quyết tại thời gian biên dịch, bạn có thể tuyên bố 'em trong một thể loại không chính thức:

@interface MyDynamicallyResolvingClass(MethodsThatWillResolveAtRuntime) 
... declare the methods here ... 
@end 

Không cần phải cung cấp một thực hiện.

Nếu bạn không biết chữ ký - nếu tên phương thức cũng là động - thì bạn sẽ cần sử dụng -performSelector: (hoặc biến thể đối số đơn hoặc kép) hoặc bạn có thể muốn sử dụng NSInvocation, trừ khi hiệu suất là một mối quan tâm lớn (nếu có, có những giải pháp thay thế có ý nghĩa hơn đáng kể).

+0

Một giao thức không chính thức giải quyết vấn đề của tôi một cách hoàn hảo. –

4

Sử dụng performSelector:

Đó là tương đương với gửi tin nhắn trực tiếp đến người nhận, tuy nhiên, nó cho phép bạn gửi tin nhắn mà không được xác định cho đến khi thời gian chạy.

Nếu phương pháp của bạn mất một hoặc hai đối số, bạn có thể sử dụng các chị em của phương pháp này: – performSelector:withObject:– performSelector:withObject:withObject:

Nếu phương pháp của bạn có nhiều hơn hai đối số, hoặc lập luận mà không phải là các loại đối tượng, câu trả lời này là không thích nghi.

+0

Chỉ hoạt động đối với các phương thức lấy 0, 1 hoặc 2 đối số loại đối tượng. – bbum

+0

Thật vậy. Đã chỉnh sửa câu trả lời để làm rõ giới hạn này. – Guillaume

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