2010-02-11 14 views
8

एनएसएसटींग विधि initWithFormat: तर्क: एक तर्क के रूप में एक va_list लेता है। जब इसका उपयोग किया जाएगा (या यहां तक ​​कि इसका उपयोग कैसे किया जाए) मैं समझ नहीं सकता। ऐप्पल इस तरह की एक विधि क्यों जोड़ता है जब नियमित initWithFormat: अधिक उपयोगकर्ता के अनुकूल है?initWithFormat कब होगा: तर्क: उपयोग किया जाना चाहिए?

उत्तर

11

आप -initWithFormat: के प्रारूप तर्कों की एक गतिशील सूची पारित नहीं कर सकते हैं। उदाहरण के लिए, यदि आप -stringByAppendingFormat: को -initWithFormat:arguments: के बिना स्वयं लागू करना चाहते हैं, तो आपके पास इसका काम होगा। va_list संस्करण के साथ, आप इसे कर सकते हैं:

- (NSString *)stringByAppendingFormat:(NSString *)format, ... { 
    va_list args; 
    va_start(args, format); 
    NSString * result = [self stringByAppendingString:[NSString stringWithFormat:format arguments:args]]; 
    va_end(args); 
    return result; 
} 
+0

ग्रेट उत्तर, धन्यवाद। – calvinlough

0

मैं इस पर और देखे बिना कहूँगा कि एप्पल लघु संस्करण अर्थ NSString initWithFormat:arguements: के शीर्ष पर एक उपयोगिता पद्धति के रूप में NSString initWithFormat: प्रदान बस अब एक फोन कर समाप्त होता है।

वहाँ भी है [एनएसएसटींग स्ट्रिंगविथफॉर्मैट:] जो एक ऑटोरेलेज्ड एनएसएसटींग वापस कर सकता है, अगर आपको लंबे समय तक स्ट्रिंग की आवश्यकता नहीं है तो आपको alloc कॉल बचाएं।

3

यह उपयोगी है जब आपका स्वयं का फ़ंक्शन या विधि विविध तर्कों का उपयोग करता है, क्योंकि उस स्थिति में वेनिला initWithFormat: विधि का उपयोग करना असंभव है।

उदाहरण के लिए निम्नलिखित (बेकार) उदाहरण के स्निपेट:

void log(NSString* format, ...) 
{ 
    va_list arguments; 
    va_start(arguments, format); 

    // impossible: 
    // NSString* formattedString = [[NSString alloc] initWithFormat: ???]; 

    // possible 
    va_list argsCopy; 
    va_copy(argsCopy, arguments); 
    NSString* formattedString = [[NSString alloc] initWithFormat:format arguments:argsCopy];  

    // do something cool with your string 
    NSLog(@"%@", formattedString); 
    va_end(argsCopy); 
    va_end(arguments); 
} 
संबंधित मुद्दे