Có cách nào để gọi [anObject performSelector] hay không; với hơn 2 đối tượng? Tôi biết bạn có thể sử dụng một mảng để vượt qua nhiều đối số, nhưng tôi đã tự hỏi liệu có một cách cấp thấp hơn để gọi một hàm mà tôi đã định nghĩa với hơn 2 đối số mà không sử dụng hàm trợ giúp với một tham số nsarray.performSelector với hơn 2 đối tượng
Trả lời
Hoặc (1) Sử dụng NSInvocation hoặc (2) trực tiếp sử dụng objc_msgSend
.
objc_msgSend(target, @selector(action:::), arg1, arg2, arg3);
(Lưu ý: chắc chắn rằng tất cả các đối số là id
's, nếu không các đối số có thể không được gửi một cách chính xác.)
Bạn có thể mở rộng các lớp NSObject
như thế này:
- (id) performSelector: (SEL) selector withObject: (id) p1
withObject: (id) p2 withObject: (id) p3
{
NSMethodSignature *sig = [self methodSignatureForSelector:selector];
if (!sig)
return nil;
NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
[invo setTarget:self];
[invo setSelector:selector];
[invo setArgument:&p1 atIndex:2];
[invo setArgument:&p2 atIndex:3];
[invo setArgument:&p3 atIndex:4];
[invo invoke];
if (sig.methodReturnLength) {
id anObject;
[invo getReturnValue:&anObject];
return anObject;
}
return nil;
}
(Xem NSObjectAdditions từ dự án Three20.) Sau đó, bạn thậm chí có thể mở rộng phương thức trên để sử dụng varargs và các mảng đối số không được chấm dứt, nhưng đó là quá mức cần thiết.
Tùy chọn bổ sung, khi bạn yêu cầu gửi nhiều đối tượng với performSelector
là (nếu dễ dàng thực hiện) để sửa đổi phương thức bạn muốn gọi để đối tượng NSDictionary
thay vì nhiều thông số, vì bạn có thể để gửi bao nhiêu tùy thích trong từ điển.
Ví dụ
Tôi đã có một phương pháp tương tự như sau trong đó có 3 đối số và tôi cần phải gọi nó là từ performSelector -
-(void)getAllDetailsForObjectId:(NSString*)objId segment:(Segment*)segment inContext:(NSManagedObjectContext*)context{
tôi đã thay đổi phương pháp này để làm cho việc sử dụng một từ điển để lưu trữ các lập luận
-(void)getAllDetailsForObject:(NSDictionary*)details{
do đó tôi đã có thể gọi phương thức dễ dàng
[self performSelector:@selector(getAllDetailsForObject:) withObject:@{Your info stored within a dictionary}];
Nghĩ rằng tôi cũng sẽ chia sẻ điều này như một lựa chọn thay thế vì nó phù hợp với tôi.
Cheers
- 1. Java tương đương với [self performSelector: foo afterDelay: 2]
- 2. Tôi có phải giữ lại một đối tượng trước khi chuyển nó tới -performSelector: withObject: afterDelay :?
- 3. Struct hoặc đối tượng trong Powershell 2
- 4. Làm thế nào để bấm một đối tượng với Panel.ZIndex thấp hơn một đối tượng khác trong wpf?
- 5. iOS - Cách triển khai performSelector với nhiều đối số và với afterDelay?
- 6. đối tượng Insert mới với đối tượng
- 7. đối tượng Immutable với initialisers đối tượng
- 8. So sánh 2 đối tượng tùy chỉnh - C#
- 9. Cách nào hiệu quả hơn đối với chuỗi một hoặc hai ký tự: CHAR (2) hoặc VARCHAR (2)?
- 10. Thời gian truy vấn Django đối với các đối tượng lớn hơn 5 giờ
- 11. Làm thế nào Path.Combine có thể được sử dụng với hơn 2 đối số?
- 12. so sánh đối tượng với bộ trống rỗng với toán tử 'is' trong Python 2.x
- 13. iPhone dev - performSelector: withObject: afterDelay hoặc NSTimer?
- 14. performSelector ARC cảnh báo
- 15. Liệu NSDictionary initWithObjectsAndKeys xử lý NULL/đối tượng bằng không và khác hơn so với các đối tượng NSString
- 16. Lưu đối tượng sử dụng biến với tên đối tượng
- 17. Sắp xếp NSmutableArray có chứa 2 loại đối tượng?
- 18. Ràng buộc DataGridViewColumn đến đối tượng cấp 2
- 19. @selector - Với nhiều đối số?
- 20. JSON.NET đối với các đối tượng C#
- 21. Xóa đối tượng khỏi bộ nhớ cache cấp 2 NHibernate
- 22. IsNullOrEmpty với đối tượng
- 23. 2 luồng chậm hơn 1?
- 24. Đối tượng miền - "Đối tượng thông minh" so với POCO
- 25. sử dụng performSelector trong iOS
- 26. có cách thông minh hơn để tạo "thời gian từ" với đối tượng DateTime
- 27. Đối tượng dễ vỡ phải có giá trị # 2
- 28. Tạo một đối tượng dựa trên 2 người khác
- 29. Biến kết xuất/đối tượng khá trong Symfony 2. *?
- 30. vấn đề 'đối tượng Foo {val 1 = 2} `trong scala
Khi sử dụng objc_msgSend, bạn sẽ cần phải #import theo: http://stackoverflow.com/questions/4896510/how-to-import-nsobjcruntime-h -to-use-objc-msgsend –
lưu ý cuối cùng mà bạn đã thực hiện về việc đảm bảo tất cả các arg đều thuộc loại id .. bạn có thể giải thích thêm? hoặc cung cấp một số tài nguyên xin vui lòng? tôi không thể tìm thấy bất kỳ. –