Dynamic Dispatch (còn được gọi là Dispatch động) là cơ chế giúp quyết định phải thực thi hoạt động nào, cụ thể là phải sử dụng phương thức thực hiện nào. Mặc định, Objective-C hỗ trợ Dynamic Dispatch.
Mỗi khi gọi một phương thức, trong trường hợp của Dynamic Dispatch, trình biên dịch của chúng ta sẽ phải xem trong cái mà chúng ta gọi là bảng tham chiếu (witness table - tạm gọi là bảng ảo hoặc bảng phân phối trong các ngôn ngữ khác) để kiểm tra hiện thực của phương thức cụ thể đó. Trình biên dịch cần xác định liệu bạn đang tham chiếu đến thực hiện (implementation) của lớp cha hay bạn đang tham chiếu đến thực hiện của lớp con. Và vì bộ nhớ cho tất cả các đối tượng được cấp phát tại runtime, trình biên dịch chỉ có thể thực hiện kiểm tra đó tại runtime.
Các thông điệp (messages) trong Objective-C được gửi đi bằng cách sử dụng hàm objc_msgSend() trong thư viện thời gian chạy. Như được trình bày trong tài liệu của Apple, hàm này có ít nhất 2 đối số:
Các thể hiện của một lớp có con trỏ isa (isa pointer), là một con trỏ đến đối tượng lớp của chúng. Các lựa chọn của phương thức trong mỗi đối tượng được lưu trữ trong một "bảng" trong đối tượng lớp, và hàm objc_msgSend() theo dõi con trỏ isa đến đối tượng lớp, để tìm bảng này và kiểm tra xem phương thức có trong bảng của lớp đó không. Nếu không thể tìm thấy, nó sẽ tìm kiếm phương thức trong bảng của lớp cha. Nếu không tìm thấy, nó sẽ tiếp tục theo dõi cây đối tượng, cho đến khi nó tìm thấy phương thức hoặc đến khi đạt đến đối tượng gốc (NSObject). Tại thời điểm này, một exception sẽ được thảy ra.
Để tăng tốc quá trình gửi thông điệp, hệ thống runtime lưu trữ các lựa chọn và địa chỉ của các phương thức khi chúng được sử dụng. Mỗi lớp có một bộ nhớ cache riêng, và nó có thể chứa các lựa chọn cho các phương thức được kế thừa cũng như các phương thức được định nghĩa trong lớp. Trước khi tìm kiếm các bảng phân phối, quy trình gửi thông điệp sẽ kiểm tra trước bộ nhớ cache của lớp của đối tượng nhận (dựa trên giả thuyết rằng một phương thức đã được sử dụng một lần có thể sẽ được sử dụng lại). Nếu lựa chọn phương thức có trong bộ nhớ cache, quá trình gửi thông điệp chỉ chậm hơn một lời gọi hàm một chút. Sau khi chương trình đã chạy đủ lâu để "làm nóng" cache, hầu hết các thông điệp gửi đi sẽ tìm thấy một phương thức đã được lưu trữ trong cache. Cache sẽ tự động mở rộng để chứa các thông điệp mới khi chương trình chạy.