2012-03-21 30 views

Trả lời

16

Mục tiêu-C là động, mặc dù đã là một lập trình viên Ruby, tôi cho rằng nó không hoàn toàn giống với Ruby.

Mục tiêu-C có tương đương với method_missing. Bạn sẽ muốn ghi đè lên cả forwardInvocation:methodSignatureForSelector: và làm theo lời khuyên quan trọng này của Apple:

quan trọng Để đáp ứng với phương pháp mà đối tượng của bạn không tự nhận ra, bạn phải ghi đè methodSignatureForSelector: ngoài việc forwardInvocation :. Cơ chế chuyển tiếp thư sử dụng thông tin thu được từ phương thứcSignatureForSelector: để tạo đối tượng NSInvocation được chuyển tiếp. Phương thức ghi đè của bạn phải cung cấp chữ ký phương thức thích hợp cho bộ chọn đã cho, hoặc bằng cách định dạng trước một hoặc bằng cách yêu cầu một đối tượng khác cho một.

Không sử dụng doesNotRecognizeSelector: như Apple cảnh báo rằng it must always result in an exception being thrown.

Xin vui lòng xem các tài liệu hướng dẫn lớp NSObject để biết thêm chi tiết: http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

+0

+1 cho câu trả lời hoàn hảo! – Vignesh

+1

Đồng thời xem phần về [Chuyển tiếp thư] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048- CH105) trong Hướng dẫn thời gian chạy Objective-C. –

-1

Tôi đoán method_missing là phương thức gọi lại được gọi khi đối tượng thiếu phương thức nhất định. Vâng, bạn có thể sử dụng phương thức respondsToSelector để kiểm tra xem một đối tượng có thể trả lời một phương thức hay không. Đó là một phương thức được khai báo trong giao thức NSObject. Vì vậy, thay vì nhận được method_missing được gọi sau khi nhận ra rằng một số phương thức bị thiếu, bạn có thể kiểm tra nó trước khi.

if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)]) 
    NSLog(@"The method is missing"); 
+0

'respondsToSelector:' trong Objective-C tương ứng với 'respond_to?' Trong Ruby, không phải 'method_missing'. – louielouie

+0

Của bạn có vẻ đơn giản hơn louielouie sự khác biệt vì tôi không thể đánh giá như newbie cảm ơn :) – user310291

+0

Tôi khuyên bạn nên kiểm tra xem một đối tượng có thể trả lời một phương pháp hay không. Bạn hầu như sẽ muốn sử dụng phương pháp này khi bạn nghi ngờ một đối tượng có thể không trả lời một phương thức, đó là một loại phòng ngừa. Nếu một đối tượng hoặc người tiền nhiệm của nó (s) không có phương pháp như vậy, chương trình của bạn sẽ sụp đổ. Nhưng gọi một phương thức chỉ với điều kiện mà đối tượng đáp ứng với nó sẽ ngăn chương trình của bạn bị rơi. phương thức method_missing theo như tôi hiểu là một phương thức được gọi khi tình huống như vậy xảy ra và không cho phép chương trình của bạn bị lỗi. Do đó, phương thức cũ là dành cho cheking và sau đó là xử lý một trường hợp. –

0

Tôi đã thực hiện mô hình này dựa trên các ví dụ về cách thêm các phương pháp tương tự đến số UITextField và một lớp con UITextView: https://stackoverflow.com/a/19661059/171933

Tận hưởng!

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