2012-02-27 45 views

Trả lời

0

Để đặt nó rất đơn giản, NSInvocation ít mạnh hơn khối. Nó chỉ gói gọn một cuộc gọi phương thức duy nhất trên một đối tượng duy nhất, trong khi các khối có thể bao bọc nhiều dòng mã tùy ý. Ngay cả khối bình phương rất đơn giản của bạn là không thể đại diện bằng cách sử dụng một lời gọi mà không có sự hỗ trợ từ một lớp học hiện có mà sẽ làm bình phương chính nó.

3

An NSInvocation là một thông báo (sử dụng bộ chọn) cho một đối tượng, với tham số tùy chọn, có thể được thực thi sau này (hoặc bây giờ), và bên ngoài ngữ cảnh hiện tại (tất nhiên, điều bạn sao chép so với giữ lại hoặc tham chiếu nếu bạn di chuyển nó). NSInvocation có lợi ích mà bạn có thể chọn lọc sao chép/tham khảo chính xác những gì bạn cần.

Khối là định nghĩa hàm địa phương bí mật, có thể chụp các phần của ngữ cảnh của luồng hiện tại hoặc hoàn toàn. Nó cũng dễ cấu hình hơn một chút so với NSInvocation vì nó tự động chụp, sao chép và giữ lại ngữ cảnh cục bộ (hoặc phạm vi) của luồng. Các khối có thể tăng kích thước nhị phân của bạn một chút, tương tự như các chức năng. Nếu được lấy ra khỏi ngữ cảnh cục bộ (ví dụ: khi bạn sao chép một khối), các khối có thể yêu cầu thời gian và bộ nhớ CPU nhiều hơn một chút - khi so sánh với NSInvocation.

3

NSInvocation là một đối tượng gói gọn một cuộc gọi thông báo: đối tượng đích, công cụ chọn, đối số và giá trị trả lại. Một khối là một đối tượng đóng gói một phần mã và một số thông tin về trạng thái của chương trình dẫn đến phần đó: cụ thể là nó ghi lại các biến trên ngăn xếp cuộc gọi đến việc tạo khối.

Cả hai điều này có thể được sử dụng rõ ràng làm gọi lại: bạn có thể sử dụng lời gọi để gửi tin nhắn đến một đối tượng hoặc bạn có thể thực thi mã của khối giống như một hàm. Điều khác biệt về chúng là cách bạn vận chuyển trạng thái trong từng trường hợp. Với lời gọi, bạn cần đối tượng đích hoặc một trong các tham số để biểu diễn ngữ cảnh trong đó thông báo xuất hiện. Với một khối, bối cảnh này được chụp tự động từ trạng thái khi khối được tạo.

+0

khối là một chức năng? hoặc đối tượng? Như @Justin nói: Khối là một định nghĩa hàm địa phương bí mật – holsety

+0

Cả hai đều là :). Một khối là một hàm ẩn danh, cùng với một bản sao của ngăn xếp tại thời điểm bạn tạo khối (nhiều hơn hoặc ít hơn). Nó cũng là một đối tượng Objective-C, để bạn có thể tạo các bản sao của khối và sau đó phát hành các bản sao đó. Khi bạn thực hiện khối, bạn thực sự chỉ cần gọi chức năng của nó; mặc dù thời gian chạy cũng thiết lập ngăn xếp của khối trước khi nhập hàm. –

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