2011-10-08 15 views
6

On Objective-C, tôi có thể làm điều gì đó như:Làm cho mình một phương pháp như - [NSArray arrayWithObjects:]; thông số vô hạn separed bằng, kết thúc bằng con số không trên lập luận

UIAlertView *av = [[UIAlertView alloc] initWith ... otherButtonTitles:@"button1", @"button2", nil]; 

Tôi có thể làm cho một phương pháp cho bản thân mình mà mất như một cuộc tranh cãi các thông số separed bằng dấu phẩy .. Và nếu thế thì sao?

Trả lời

13

Khai báo các phương pháp như thế này trong @interface của bạn:

- (id)myObjectWithObjects:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION; 

Sau đó, trong @implementation bạn sẽ xác định nó như thế này:

- (id)myObjectWithObjects:(id)firstObject, ... 
{ 
    va_list args; 
    va_start(args, firstObject); 
    for (id arg = firstObject; arg != nil; arg = va_arg(args, id)) 
    { 
     // Do something with the args here 
    } 
    va_end(args); 

    // Do more stuff here... 
} 

Các va_list, va_start, va_argva_end đều chuẩn C cú pháp để xử lý các đối số biến. Để mô tả chúng đơn giản:

  • va_list - Một con trỏ tới danh sách đối số biến.
  • va_start - Khởi tạo một va_list để trỏ đến đối số đầu tiên sau khi đối số được chỉ định.
  • va_arg - Tìm nạp đối số tiếp theo trong danh sách. Bạn phải chỉ định kiểu của đối số (để va_arg biết số byte cần trích xuất).
  • va_end - Phát hành bất kỳ bộ nhớ nào được giữ bởi cấu trúc dữ liệu va_list.

Kiểm tra bài viết này cho một lời giải thích tốt hơn - Variable argument lists in Cocoa


Xem thêm: "IEEE Std 1003.1 stdarg.h"


Một ví dụ khác từ Apple Technical Q&A QA1405 - Variable arguments in Objective-C methods:

@interface NSMutableArray (variadicMethodExample) 

- (void) appendObjects:(id) firstObject, ...; // This method takes a nil-terminated list of objects. 

@end 

@implementation NSMutableArray (variadicMethodExample) 

- (void) appendObjects:(id) firstObject, ... 
{ 
    id eachObject; 
    va_list argumentList; 
    if (firstObject) // The first argument isn't part of the varargs list, 
    {         // so we'll handle it separately. 
     [self addObject: firstObject]; 
     va_start(argumentList, firstObject); // Start scanning for arguments after firstObject. 
     while (eachObject = va_arg(argumentList, id)) // As many times as we can get an argument of type "id" 
      [self addObject: eachObject]; // that isn't nil, add it to self's contents. 
     va_end(argumentList); 
    } 
} 

@end 
+0

Cảm ơn, chấp nhận. Chỉ cần thêm rằng tôi tìm thấy http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html, và nó sẽ được tốt đẹp nếu bạn chỉnh sửa câu trả lời của bạn nói với người đọc rằng sử dụng stdarg là cần thiết. Dù sao, cảm ơn rất lớn, sẽ chấp nhận ngay khi StackOverflow cho phép tôi. – Matoe

+0

@Matoe Sẽ làm, cảm ơn mẹo. – chown

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