Đây là một tối ưu hóa nhỏ có thể không thực sự xứng đáng với thời gian để triển khai, và cái mà tôi không bao giờ sử dụng cá nhân, nhưng tôi vẫn đoán là tốt. Thay vì liên tục gửi cùng một thông điệp đến cùng một đối tượng, bạn có thể bỏ qua việc gửi phương thức lặp lại bằng cách trực tiếp sử dụng phương thức triển khai thực hiện. Ví dụ, thay vì:
for (int i = 0; i < 100000000; i++)
[someObject messageWithInt:i];
Bạn có thể thử:
SEL theSelector = @selector(messageWithInt:);
IMP theMethod = [someObject methodForSelector:theSelector];
for (int i = 0; i < 100000000; i++)
theMethod (someObject, theSelector, i);
này có nghĩa là tra cứu phương pháp chỉ được thực hiện một lần và bạn có thể gọi phương pháp trực tiếp thông qua các trở IMP
giá trị. Tất cả các thực thi phương thức Objective-C có ít nhất hai đối số, đối số đầu tiên là đối tượng nhận kiểu id
, trở thành self
trong thực hiện phương thức và đối số thứ hai là công cụ chọn [loại SEL
] đã được sử dụng để xác định phương thức triển khai và trở thành _cmd
trong quá trình triển khai phương pháp.
Cách tiếp cận này có thể nhanh chóng biến mất nếu bạn không sử dụng đúng định nghĩa chức năng “ ” (Tôi không thể nhớ thuật ngữ thích hợp). IMP
là một typedef
cho hàm trả về void*
và mất (id,SEL,...)
làm đối số. Điều này có thể làm cho nó phiền hà khi sử dụng nếu phương thức thực sự trả về một cái gì đó khác như float
. Để giúp đỡ với vấn đề này, bạn có thể đúc các giá trị trở lại của -methodForSelector:
, như thế này:
typedef float (*MyMethodIMP)(id,SEL,int);
SEL theSel = @selector(messageWithInt:);
MyMethodIMP theMethod = (MyMethodIMP)[someObject methodForSelector:theSel];
float result = 0.0;
for (int i = 0; i < 100000000; i++)
result += theMethod (someObject, theSel, i);
Với một số chăm sóc, bạn có thể lưu theMethod
và bạn có thể sử dụng nó cho tất cả các trường hợp của một lớp học đặc biệt, không chỉ là một ví dụ, mà còn cẩn thận.
Chủ đề này được thảo luận chi tiết ở đây: http://www.mulle-kybernetik.com/artikel/Optimization/ – codewarrior
Trong một khuôn khổ cấp cao như Cocoa, hầu hết các tối ưu hóa nhỏ như thế này đều lãng phí thời gian (ngoài việc thay đổi cài đặt trình biên dịch), vì rất nhiều các lớp cơ bản đã được tối ưu hóa rất nhiều. Bạn chỉ nên tối ưu hóa nếu tiểu sử hiển thị rằng có điều gì đó đang tốn nhiều thời gian hơn. – shosti