Trong mã được tối ưu hóa hoàn toàn, không có cách chắc chắn 100% để xác định người gọi đến một phương thức nhất định. Trình biên dịch có thể sử dụng tối ưu hóa cuộc gọi đuôi trong khi trình biên dịch có hiệu quả tái sử dụng khung ngăn xếp của người gọi cho callee.
Để xem ví dụ về điều này, hãy đặt điểm ngắt trên bất kỳ phương thức đã cho nào bằng gdb và xem backtrace. Lưu ý rằng bạn không thấy objc_msgSend() trước mỗi cuộc gọi phương thức. Đó là bởi vì objc_msgSend() thực hiện một cuộc gọi đuôi đến việc thực hiện từng phương thức.
Trong khi bạn có thể biên dịch ứng dụng của bạn không được tối ưu hóa, bạn sẽ cần các phiên bản không được tối ưu hóa của tất cả các thư viện hệ thống để tránh chỉ một vấn đề này.
Và đây chỉ là một vấn đề; có hiệu lực, bạn đang hỏi "làm cách nào để phát minh lại CrashTracer hoặc gdb?". Một vấn đề rất khó khăn khi nghề nghiệp được thực hiện. Trừ khi bạn muốn "gỡ lỗi công cụ" để được sự nghiệp của bạn, tôi sẽ khuyên bạn nên chống lại đi xuống con đường này.
Bạn đang thực sự cố gắng trả lời câu hỏi nào?
Đây là một câu trả lời. –
@alexgray Làm cách nào để chống trả lời?Câu trả lời là chính xác trong phạm vi và quy mô của vấn đề và, với sự chấp nhận và câu hỏi cuối cùng, hy vọng dẫn đầu OP xuống một con đường để thành công. – bbum