2011-06-25 23 views
26

Tôi đã nhìn thấy như:Mục tiêu-C: Tại sao chọn nil trước respondsToSelector :? đang

if (delegate != nil && [delegate respondsToSelector:@selector(doSomething)]) ... 

Nhưng, gửi một thông điệp tới nil chỉ trả nil (mà đánh giá để NO), vậy tại sao không chỉ làm:

if ([delegate respondsToSelector:@selector(doSomething)]) ... 

Là cựu nhanh hơn nếu delegate == nil? Dù bằng cách nào, tôi thích nguyên nhân thứ hai nó ít mã.

Và, less là tốt hơn more. Mọi chuyên gia Unix đều biết điều đó.

+0

Tôi có xu hướng sử dụng cái sau và cũng quét mã của tôi để kiểm tra không cần thiết cho số không. Nếu nil không đau, đừng kiểm tra. Nếu nil sẽ là một sai lầm lập trình, không kiểm tra nó (có thể sử dụng một khẳng định thay thế). – Eiko

Trả lời

22

objc_msgGửi, chức năng được sử dụng để gửi tin nhắn động trong Objective-C ngay lập tức kiểm tra đối số đầu tiên (bộ nhận tin nhắn) và trả về nếu nó == không. Do đó, chi phí duy nhất của nhắn tin nil là một cuộc gọi hàm liên kết động được gọi là hàm, tốn kém hơn một chút so với một cuộc gọi hàm "bên trong nhị phân". Nhìn chung, là một cách tiếp cận hiệu quả hơn so với khác? Các câu lệnh điều kiện phức hợp thường yêu cầu phân nhánh bổ sung, vì vậy câu trả lời là không thể xác định được mà không cần nhìn vào mã trình biên dịch tạo ra, nhưng quan trọng hơn là lược tả chương trình đang chạy. Tối ưu hóa sớm là Bad Thing ™, nhưng tôi xin chúc mừng bạn đã thực sự xem xét hiệu quả và đặt câu hỏi "thành ngữ" như thế này.

+0

Haha. Câu trả lời ngọt ngào! Cảm ơn! – ma11hew28

+0

@MattDiPasquale vui lòng nhận câu trả lời của mình ~ – user392412

+0

Sẽ rất thú vị nếu ai đó biên dịch hai phiên bản khác nhau và phân tích hội đồng được tạo để xem nhanh hơn. :) – ma11hew28

5

Bạn là chính xác. Đây là chi phí không cần thiết về mặt kỹ thuật trong Obj-C vì mọi thư được gửi đến nil sẽ tự động trả lại nil. Tuy nhiên, nếu bạn bỏ qua cuộc gọi đến số respondsToSelector: bằng cách kiểm tra xem trước tiên là số nil thì bạn sẽ bỏ qua phí trên của cuộc gọi respondsToSelector:. Vì vậy, nó sẽ nhanh hơn, nhưng bởi bao nhiêu, tôi không chắc chắn.

-3

Có một vấn đề cú pháp ở đây- nếu bạn đang gửi -respondsToSelector đến một đối tượng nil, nó sẽ luôn trả về 0. Đây là lý do tại sao bạn sẽ làm một điều như vậy.

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