2012-07-31 11 views
22

सबसे पहले, इस सरल प्रश्न के लिए खेद है। लेकिन मुझे यह समझने की जरूरत है कि क्या हो रहा है।उद्देश्य सी - मूल्य से पास और संदर्भ द्वारा पास

मैंने सोचा कि आउटपुट upper case string होना चाहिए। लेकिन यह UPPER CASE STRING होने के लिए आता है।

- (void)test 
{ 
    NSString *stringVar = @"UPPER CASE STRING"; 
    [self changeString:stringVar]; 
    NSLog(@"value after changed : %@", stringVar); 
} 

- (void)changeString:(NSString*)string 
{ 
    string = [string lowercaseString]; 
} 

क्या हो रहा है और इसे कैसे ठीक किया जाए?

उत्तर

52

[string lowercaseString] कॉल एक नईNSString उद्देश्य यह है कि आप स्थानीय चर string को असाइन पैदा करता है। यह changeString फ़ंक्शन के बाहर stringVar का मान नहीं बदलता है। सूचक स्वयं मूल्य से पारित किया जाता है।

-(void) test 
{ 
    NSString *stringVar = @"UPPER CASE STRING"; 
    stringVar =[self changeString:stringVar]; 
    NSLog(@"value after changed : %@", stringVar); 
} 
-(NSString *) changeString:(NSString*)string 
{ 
    return [string lowercaseString]; 
} 
+0

बस सुनिश्चित करने के लिए, एआरसी स्मृति पारदर्शी रूप से इस मामले में भी हैंडलिंग, सही संभाल होगा? –

+0

प्रिय ग्रेग, इसका मतलब है डिफ़ॉल्ट रूप से उद्देश्य सी मूल्य तंत्र द्वारा पास का उपयोग करता है? –

+0

@ जोचिम इक्सक्सन: हाँ, एआरसी मेमोरी प्रबंधन को सही तरीके से संभालता है (संकलक आपको चेतावनी देगा अगर यह पता नहीं लगा कि आप क्या कर रहे हैं)। –

0

-(void) changeString:(NSString*)string में स्ट्रिंग स्थानीय चर रहा है, मान देने के लिए विधि को संशोधित:

एक तरह से तुम क्या चाहते करने के लिए, एक सूचक के सूचक के पारित करने के लिए है [NSString lowerCaseString]method के संदर्भ को देखें, आप देख सकते हैं कि यह लोअरकेस वाले वर्णों के साथ एक नई स्ट्रिंग देता है:

रिसीवर के कम निर्धारित प्रतिनिधित्व देता है।

- (NSString *)lowercaseString 

क्या अपने कोड बस lowercaseString कॉल के उत्पादन, जो कोई प्रभाव नहीं है के साथ इनपुट स्ट्रिंग के संदर्भ के ऊपर लिख रहा है है।

-(void) test 
{ 
    NSString *stringVar = @"UPPER CASE STRING"; 
    stringVar = [self changeString:stringVar]; 
    NSLog(@"value after changed : %@", stringVar); 
} 

-(NSString *) changeString:(NSString*)string 
{ 
    string = [string lowercaseString]; 
    return string; 
} 

आप यह समझना होगा कि NSString अपरिवर्तनीय है तो वहाँ कोई रास्ता नहीं है, संदर्भ फिर नियत के अलावा अन्य की जरूरत है: इस समस्या को हल करने के लिए सबसे अच्छा तरीका है कि आप अपने आप को मूल्य है, जो विधि आसान बना देता है समझने के लिए वापस जाने के लिए के लिए है , एक स्ट्रिंग की सामग्री को बदलने के लिए। हालांकि, आप NSMutableString का उपयोग कर सकते हैं, जिसे जगह में संशोधित किया जा सकता है।

+0

एनएसएसटींग को 'शून्य' विधि में असाइन करना एक त्रुटि है और 'शून्य' विधि कोई मान नहीं लौटाती है – Sumanth

+0

क्षमा करें, मेरा बुरा, cource वापसी मूल्य का 'NSString *' है –

5

आप हैं:

-(void) test 
{ 
    NSString *stringVar = @"UPPER CASE STRING"; 
    [self changeString:&stringVar]; 
    NSLog(@"value after changed : %@", stringVar); 
} 

-(void) changeString:(NSString**)string 
{ 
    *string = [*string lowercaseString]; 
} 
0

string एक स्थानीय चर (एक एनएसएसटींग के लिए एक सूचक जो अपरिवर्तनीय है) है, तो आप स्थानीय फ़ंक्शन में string अंक बदल रहे हैं, लेकिन जब आप अपना मूल्य वापस कर देंगे तो फेंक दिया जाएगा।

आप क्या करना चाहते हैं बस स्ट्रिंग को पैरामीटर के रूप में पास करना और फ़ंक्शन से कम केस स्ट्रिंग को वापस करना है।

1

मैं भी समस्या से ऊपर की चर्चा करते हुए कर रहा हूँ और mistake.Find के साथ मदद कर मेरी टिप्पणी

- (void)test 
{ 
    NSString *stringVar = @"UPPER CASE STRING"; 
    //StringVar is a pointer to integer class.let us assume the address the stringVar be 0x50 and the value it has be 0x100 
    //So 0x100 has the string 

    [self changeString:stringVar]; 
    //above we are calling the method to lowercase and argument is stringVar 
    //As the method is called we pass 0x100 in the argument as this is the memory where the value is kept 

    NSLog(@"value after changed : %@", stringVar); 
    //Our StringVar still points to 0x100 where the value is in upperString 
} 

- (void)changeString:(NSString*)string 
{ 
    string = [string lowercaseString]; 
    // Now operation performed on string returns a new value on suppose location 0x200 
    //String parameter passed in argument is assigned the new value.But we never pass values as we pass only location under the hood 
    //New parameter passed now points to new memory location 0x200 

} 

--------------------------------------------------------------------------------- 
With the new solution 
-(void) test 
{ 
    NSString *stringVar = @"UPPER CASE STRING"; 
    //let 0x50 be stringVar memorylocation pointing to 0x100 with above value 
    [self changeString:&stringVar]; 
    //0x50 is passed in argument 
    NSLog(@"value after changed : %@", stringVar); 
    //On new location stored in address of stringVar it points to new string value 
} 

-(void) changeString:(NSString**)string 
{ 
    *string = [*string lowercaseString]; 
    //0x200 is new memory location received.*string gives the 0x100 location and hence the value 
    //LHS is assigned to new location .On LHS you find *string which will be assigned 0x200 
    //As string with location 0x50 is value 0x200 which will make it to point new  location where lowercase string exist 
}