Từ những gì tôi đã học được cho đến nay: Trong Mục tiêu-C, bạn có thể gửi bất kỳ thông điệp nào đến bất kỳ đối tượng nào. Nếu đối tượng thực hiện đúng phương thức, nó sẽ được thực hiện nếu không sẽ không có gì xảy ra. Điều này là do trước khi tin nhắn được gửi Mục tiêu-C sẽ thực hiện respondsToSelector.Mục tiêu-C respondsToSelector
Tôi hy vọng tôi đã đúng cho đến nay.
Tôi đã thực hiện một chương trình nhỏ để kiểm tra nơi một hành động được gọi mỗi khi một thanh trượt được di chuyển. Ngoài ra để thử nghiệm tôi đặt người gửi đến NSButton nhưng trên thực tế nó là một NSSlider. Bây giờ tôi đã hỏi đối tượng nếu nó sẽ trả lời setAlternateTitle. Trong khi một NSButton sẽ làm và NSSlider sẽ không. Nếu tôi chạy mã và làm respondsToSelector bản thân mình, nó sẽ cho tôi biết đối tượng sẽ không phản hồi với bộ chọn đó. Nếu tôi thử nghiệm một cái gì đó khác như intValue, nó sẽ phản hồi. Vì vậy, mã của tôi là tốt cho đến nay.
- (IBAction)sliderDidMove:(id)sender
{
NSButton *slider = sender;
BOOL responds =
[slider respondsToSelector:@selector(setAlternateTitle)];
if(responds == YES)
{
NSLog(@"YES");
}
else
{
NSLog(@"NO");
}
[slider setAlternateTitle:@"Hello World"];
}
Nhưng khi tôi thực sự gửi thông báo setAlternateTitle chương trình sẽ bị lỗi và tôi không chắc chắn lý do tại sao. Không nên làm một respondsToSelector trước khi gửi tin nhắn?
+1 cho giải thích tuyệt vời này. Bạn có thể cung cấp một số liên kết trong đó toàn bộ quá trình này được ghi lại chi tiết không. Đó là giá trị đọc. – taskinoor
Các tài liệu có tại đây: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html một phần ... Các nội dung khác nằm trong tham chiếu lớp NSObject – Psycho
bằng cách này , 'forwardingTargetForSelector:' chỉ trong Mac OS X 10.6+ hoặc iOS 4+ – user102008