2011-12-14 30 views
5

Tôi đang cố gắng để vượt qua một cuộc tranh luận variadic (NSString *) từ một phương pháp để phương pháp khác như ví dụ sau:đèo luận variadic từ một phương pháp khác với ARC


- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... { 
    // ... do something with parts 
} 

- (NSURL *)specialUrlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... { 
    va_list arg; 
    va_start(args, aPart); 
    [self urlForId:aId params:aParam parts:args]; 
    va_end(args); 
} 

Những vấn đề bắt đầu khi cố gắng vượt qua args cùng. ARC phàn nàn về việc chuyển đổi ngầm từ va_list (char *) sang NSString *. Tôi đã thử mọi thứ để làm việc này.

Kỹ thuật tương tự này sẽ hoạt động nếu tôi chuyển va_list vào [NSString stringWithFormat: ...] vì vậy tôi không thấy lý do tại sao nó không hoạt động ở đây.

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

3

Phương thức urlForId:params:parts: của bạn hy vọng đối số đầu tiên sau bàn phím parts:NSString*, nhưng bạn đang chuyển nó theo số va_list. Đó là những loại khác nhau. Việc chuyển một biến số va_list làm tham số hàm không mở rộng nó một cách kỳ diệu vào tất cả các đối số ban đầu. Dưới bìa một va_list thực sự chỉ là một con trỏ vào khung ngăn xếp của bạn, và đó là tất cả những gì được thông qua.

Những gì bạn thực sự cần làm ở đây là đưa ra phần urlForId:params:parts: đi vào danh sách các bộ phận và gọi phần được tính toán đó trực tiếp từ specialUrlForId:params:parts:. Có lẽ phương pháp urlForId:params:parts: của bạn trông giống như sau:

- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... 
{ 
    va_list ap; 
    va_start(ap, aPart); 

    // loop over the variable arguments, starting with aPart, perhaps 
    // stopping when you find nil. 
    while (aPart != nil) { 
     doSomething(aPart); 
     aPart = va_arg(ap, NSString *); 
    } 

    va_end(ap); 

    return someUrl; 
} 

Vì vậy, những gì bạn muốn làm ở đây là di chuyển các phần sau va_start và trước va_end đến một phương pháp mà phải mất một tham số va_list:

- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams arguments:(va_list)ap 
{ 
    // loop over the variable arguments, starting with aPart, perhaps 
    // stopping when you find nil. 
    while (aPart != nil) { 
     doSomething(aPart); 
     aPart = va_arg(ap, NSString *); 
    } 
    return someUrl; 
} 

Sau đó, bạn làm cho cả hai urlForId:params:parts:specialUrlForId:params:parts: gọi phương thức mới này là urlForId:params:arguments::

- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... 
{ 
    va_list ap; 
    va_start(ap, aPart); 
    NSURL *url = [self urlForId:aId params:aParams arguments:ap]; 
    va_end(ap); 
    return url; 
} 

- (NSURL *)specialUrlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... 
{ 
    va_list ap; 
    va_start(ap, aPart); 
    NSURL *url = [self urlForId:aId params:aParams arguments:ap]; 
    va_end(ap); 
    return url; 
} 
+0

Cuối cùng, tôi làm lại mã của tôi để tôi có thể tránh đi qua trong varargs, nhưng điều này giải thích tình hình thực sự tốt. – Luke

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