Bạn có thể sử dụng phương pháp NSTimer
:
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
invocation:(NSInvocation *)invocation
repeats:(BOOL)repeats;
Thay vào đó, kể từ khi một đối tượng NSInvocation
sẽ cho phép bạn để vượt qua đối số; một đối tượng NSInvocation
là, như các docs định nghĩa nó:
một Objective-C nhắn render tĩnh, có nghĩa là, nó là một hành động biến thành một đối tượng.
Trong khi tạo một đối tượng NSTimer
sử dụng một selector đòi hỏi định dạng của các phương pháp phúc:
- (void)timerFireMethod:(NSTimer*)theTimer
Một NSInvocation
cho phép bạn thiết lập các mục tiêu, chọn, và các đối số mà bạn vượt qua trong:
SEL selector = @selector(myMethod:setValue2:);
NSMethodSignature *signature = [MyObject instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:selector];
NSString *str1 = @"someString";
NSString *str2 = @"someOtherString";
//The invocation object must retain its arguments
[str1 retain];
[str2 retain];
//Set the arguments
[invocation setTarget:targetInstance];
[invocation setArgument:&str1 atIndex:2];
[invocation setArgument:&str2 atIndex:3];
[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:invocation repeats:YES];
đâu MyObject
là lớp học mà myMethod:setValue2:
được khai báo và thực hiện trên - instanceMethodSignatureForSelector:
là một functi tiện trên tuyên bố trên NSObject
trả về một đối tượng NSMethodSignature
cho bạn, được chuyển đến NSInvocation
.
Ngoài ra, cần lưu ý, với setArgument:atIndex:
, các chỉ số cho các đối số được truyền cho phương thức thiết lập như khi bắt đầu công cụ chọn ở chỉ số 2. Từ các tài liệu:
Chỉ số 0 và 1 cho thấy các đối số ẩn tự và _cmd, tương ứng; bạn nên thiết lập các giá trị này trực tiếp với các phương thức setTarget: và setSelector:.Sử dụng các chỉ số 2 và lớn hơn cho các đối số thường được truyền trong một tin nhắn.
Nguồn
2009-08-28 23:02:01
Đây là câu trả lời hay hơn tôi. Bạn nên làm điều này để tránh gây ô nhiễm cho việc triển khai của bạn bằng các phương thức không cần thiết. –
Lưu ý rằng, là 'str1' và' str2' không được phân bổ tĩnh, bạn sẽ bị rò rỉ chúng. 'NSTimer' được ghi lại là gửi' -retainArguments' đến đối tượng invocation của nó, nhưng nó sẽ không làm tổn thương cho bạn để gửi '-retainArguments' đến đối tượng invocation. Vấn đề là tự giữ lại các đối số, sau đó nói với lời kêu gọi giữ lại chúng. Không giữ lại đối số lời gọi! Để lời gọi xử lý nó - và, ở đây, để bộ hẹn giờ tự xử lý nó. –
Không mã hóa lớp 'targetInstance', như đã được thực hiện trong việc truy xuất chữ ký phương thức. Nếu bạn thực sự muốn sử dụng '+ instanceMethodSignatureForSelector:', bạn có thể sử dụng '[[targetInstance class] instanceMethodSignatureForSelector: selector]', nhưng điều đó không cần thiết phức tạp - chỉ cần hỏi chính đối tượng đó cho chữ ký phương thức bằng cách sử dụng '[targetInstance methodSignatureForSelector: selector]' . –