SEL là loại đại diện cho bộ chọn trong Mục tiêu-C. Từ khóa @selector() trả về SEL mà bạn mô tả. Nó không phải là một con trỏ hàm và bạn không thể vượt qua nó bất kỳ đối tượng hoặc tài liệu tham khảo dưới bất kỳ hình thức nào. Đối với mỗi biến trong bộ chọn (phương thức), bạn phải biểu diễn điều đó trong lời gọi đến @selector. Ví dụ:
-(void)methodWithNoParameters;
SEL noParameterSelector = @selector(methodWithNoParameters);
-(void)methodWithOneParameter:(id)parameter;
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here
-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo;
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted
Bộ chọn thường được chuyển đến phương thức đại biểu và gọi lại để chỉ định phương thức nên được gọi trên một đối tượng cụ thể trong khi gọi lại. Ví dụ, khi bạn tạo một bộ đếm thời gian, phương pháp gọi lại được xác định cụ thể như:
-(void)someMethod:(NSTimer*)timer;
Vì vậy, khi bạn lên lịch hẹn giờ bạn sẽ sử dụng @selector để xác định các phương pháp trên đối tượng của bạn sẽ thực sự chịu trách nhiệm về callback:
@implementation MyObject
-(void)myTimerCallback:(NSTimer*)timer
{
// do some computations
if(timerShouldEnd) {
[timer invalidate];
}
}
@end
// ...
int main(int argc, const char **argv)
{
// do setup stuff
MyObject* obj = [[MyObject alloc] init];
SEL mySelector = @selector(myTimerCallback:);
[NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
// do some tear-down
return 0;
}
Trong trường hợp này, bạn xác định rằng đối tượng obj được nhắn tin với myTimerCallback sau mỗi 30 giây.
Nguồn
2008-11-18 02:48:39
@Jim Puls - đây thực sự là một vấn đề Objective-C ... nó không cụ thể hơn cho Cocoa hoặc Cocoa-touch so với iPhone-sdk. Ngoài ra, chúng tôi đang đi với thẻ mục tiêu-c trên objectivec những ngày này :) –