2010-02-27 29 views
16

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

48

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.)

+12

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 –

+1

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ỳ. –

14

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.

0

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

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