2013-08-17 34 views
16

Tôi đã sử dụng phương pháp này để xử lý tất cả các lời gọi phương thức trong một lớp với một số chức năng bổ sung. Cụ thể tôi là:NSProxy vs NSObject

  • Kiểm tra nếu đối tượng cần thiết cho cuộc gọi phương pháp này là trong bộ nhớ cache
  • Nếu bộ nhớ cache có đối tượng mà trả lại.
  • Nếu không, hãy gửi đến bản triển khai gốc, điền vào bộ nhớ cache và trả lại.

Đối với mỗi phương pháp, tôi sẽ định tuyến lại phương pháp được khuyên dùng. Và thực hiện phương pháp mới bằng cách sử dụng + (BOOL) resolveInstanceMethod: (SEL) sel và IMP_implementationWithBlock.

Nó hoạt động tốt, nhưng mã không đọc độc đáo. Có vẻ như NSProxy sẽ cung cấp một cách neater để thực hiện chức năng này.

Nhưng vẫn còn một giải pháp thay thế khác, sẽ đơn giản là có một cuộc gọi phương thức đứng và chặn của lớp con NSObject xung quanh các phương thức của đối tượng đích của tôi. Bằng cách ghi đè forwardInvocation và methodSignatureForSelector, tôi có thể nhận được kết quả cần thiết.

Vì vậy, NSProxy cung cấp cho tôi những gì? Tại sao tôi nên sử dụng thay vào đó?

Trả lời

12

Điểm NSProxy là điểm không thực hiện hầu hết các phương pháp. Điều đó là cần thiết để đảm bảo rằng máy móc chuyển tiếp Objective-C được gọi để bắt đầu. Nếu bạn bắt đầu với NSObject, có rất nhiều phương pháp sẽ được gửi trực tiếp mà không có cơ hội chuyển tiếp chúng.

+2

Bạn có thể cụ thể hơn không? Trong bất kì trường hợp nào? Tôi đã thực hiện một proxy và nó hoạt động cho dù tôi mở rộng NSProxy hay không. –

+0

Nhìn vào giao diện của 'NSObject'. Bất kỳ phương thức nào được định nghĩa ở đó không được định nghĩa trong 'NSProxy' cũng không được ghi đè bởi lớp proxy của bạn sẽ không được chuyển tiếp. Hãy chắc chắn cũng xem xét tất cả các loại trên 'NSObject' (những người có triển khai, không phải là các giao thức không chính thức). Một ví dụ có thể là '-classForCoder' và bạn bè. Điều gì sẽ xảy ra nếu bạn cố gắng lưu trữ một 'NSString' được bao bọc trong lớp proxy của bạn? –

+0

Ah. . Tôi đã được ấn tượng rằng nó chỉ đi xuống đến kết quả của -methodSignatureForSelector –

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