2011-01-19 35 views
5

Bạn có thể khai báo các chức năng như inlines như thế này:Tôi có thể nội tuyến các phương thức lớp tĩnh trong Objective-C không?

#ifdef DEBUG 
void DPrintf(NSString *fmt,...); 
#else 
inline void DPrintf(NSString *fmt,...) {} 
#endif 

để khi bạn đang không ở trong DEBUG, không có chi phí cho chức năng vì nó tối ưu hóa và nội tuyến. Điều gì sẽ xảy ra nếu bạn muốn có cùng một thứ nhưng đối với một phương thức lớp học?

Lớp học của tôi được khai báo như thế này:

@interface MyClass : NSObject { 

} 

    + (void)DPrintf:(NSString *)format, ...; 
    // Other methods of this class 
@end 

Tôi muốn chuyển đổi 'DPrintf' vào một cái gì đó tương tự như inline để không có chi phí để gọi phương pháp này.

Nhưng tôi không thể làm điều này:

inline +(void)DPrintf:(NSString *)format, ...; {} 

Làm thế nào tôi có thể có một phương pháp tĩnh zero-chi phí của một lớp tắt khi biên dịch không-debug?

Trả lời

8

Hãy cẩn thận. Các phương thức Objective-C không giống như các hàm C. Một phương thức Objective-C được dịch bởi trình biên dịch thành cuộc gọi hàm objc_msgSend(); bạn không có quyền kiểm soát liệu một phương thức có nội tuyến hay không bởi vì phương thức đó không liên quan. Bạn có thể đọc thêm về thời gian chạy Objective-C here (Objective-C Runtime Programming Guide), here (Objective-C Runtime Reference)here (CocoaSamurai post) và tìm kiếm nhanh trên Google sẽ hiển thị thêm thông tin.

+4

Ngoài ra, hãy cẩn thận tối ưu hóa sớm. Một đánh dấu nội tuyến trên một chức năng đó là công cụ in ấn không có khả năng tiết kiệm nhiều thời gian, ngay cả khi chức năng được gọi là rất nhiều. Nội tuyến chủ yếu chỉ có ý nghĩa trong đó sự trở lại rất dễ tính toán, vì vậy chức năng gọi trên không là đáng kể. Không có gì liên quan đến bất kỳ biến thể của printf là dễ dàng về số lượng các hướng dẫn được gọi là. –

+4

Bên cạnh thực tế là ngày nay, hầu hết các trình biên dịch hiện đại (cho dù GCC hay Clang) thường biết cách nhận biết các hàm hoạt động tốt trong nội bộ của chúng và sẽ đánh dấu chúng là chính chúng. Con người rất nổi tiếng khi ước lượng những hàm nào làm việc tốt, vì vậy bạn nên để nó một mình để trình biên dịch tìm ra (tôi đã nghe về một số trình biên dịch C thậm chí sẽ bỏ qua cho dù bạn đánh dấu các hàm như nội tuyến hay không) cảnh giác). –

6

Không có phương pháp tĩnh như vậy trong Mục tiêu-C. Chỉ có các phương thức lớp, giống như các phương thức thể hiện, ngoại trừ chúng thuộc về một lớp. Điều này có nghĩa rằng, giống như các phương thức ví dụ, một thông điệp gửi đến một lớp phải đi qua máy gửi thư để xác định phương thức chính xác để gọi và được thực hiện khi chạy. Bạn có thể nội tuyến cuộc gọi đến phương thức dispatch dispatch machine, nhưng phần thân phương thức vẫn không thể được inline mà không có mức tối ưu hóa điên rồ không tồn tại trong bất kỳ trình biên dịch Objective-C nào tại thời điểm này.

Dù sao, đây là tối ưu hóa vi mô. Nếu hồ sơ cho thấy nó là cần thiết (mà nó gần như không bao giờ sẽ), sau đó bạn có thể đi qua thể dục dụng cụ. Nếu không, hãy lo lắng về các mối quan tâm hiệu suất thực tế trong ứng dụng của bạn.

+3

Đối với những người (giống như tôi) đến từ một nền Java, nơi các phương thức lớp và các phương thức tĩnh đồng nghĩa, lưu ý rằng trong các phương thức lớp Objective-C được giải quyết động - hoạt động trên các đối tượng lớp, đó là lý do tại sao chúng không "tĩnh". http://en.wikipedia.org/wiki/Method_(computer_programming) –

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