2009-11-23 8 views
5

मैं उद्देश्य-सी में सरणी के भीतर पॉइंटर्स से संबंधित एक समस्या में आया हूं।डीएसईफ़्रेंसिंग द्वारा एनएसएआरएआरई के भीतर मूल्यों को बदलें?

जो मैं करने की कोशिश कर रहा हूं वह पॉइंटर्स को एनएसएआरएआरई में ले जाता है, उन्हें एक विधि में पास करता है, और उसके बाद लौटा मूल्य वापस मूल सूचक (सूचक जो सरणी से संबंधित होता है) को असाइन करता है।

सी और सी ++ से जो कुछ मुझे पता है, उसके आधार पर पॉइंटर्स को डिफ्रेंस करके, मैं उन मानों को बदलने में सक्षम होना चाहिए जो वे इंगित करते हैं ... यहां वह कोड है जिसका मैं उपयोग कर रहा हूं, लेकिन यह काम नहीं कर रहा है (एनएसएलओजी आउटपुट के आधार पर मूल्य फोन बिंदु कभी नहीं बदलते हैं)। चर फोन के साथ PHONENUMBERS भीतर

- (NSString*) removeNonNumbers: (NSString*) string; 

आप देख सकते हैं, मैं पुनरावृत्ति कर रहा हूँ प्रत्येक NSString * के माध्यम से:

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"]; 
    for (NSString* phone in phoneNumbers) { 
     (*phone) = (*[self removeNonNumbers:phone]); 
     NSLog(@"phone:%@", phone); 
    } 

और यहाँ विधि हस्ताक्षर मैं करने के लिए NSString * गुजर रहा है। मैं फोन को हटाने के लिए पास करता हूं नॉनबॉर्स: जो संशोधित एनएसएसटींग * लौटाता है। मैं फिर हटा देता हूं पॉइंटर को हटाए गए नंबर से वापस लौटाता है और फोन को मान असाइन करता है।

जैसा कि आप बता सकते हैं, शायद मैं उद्देश्य-सी वस्तुओं को अच्छी तरह समझ नहीं पा रहा हूं। मुझे यकीन है कि यह सी ++ या सी में काम करेगा, लेकिन मैं नहीं देख सकता कि यह यहां क्यों काम नहीं करता है! आपकी सहायता के लिये पहले से ही धन्यवाद!

उत्तर

13

हाँ, यह काम नहीं करेगा। इस कुछ हद तक काम कर सकते हैं जबकि

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy]; 
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) { 
    NSString * phone = [phoneNumbers objectAtIndex:i]; 
    phone = [self removeNonNumbers:phone]; 
    [phoneNumbers replaceObjectAtIndex:i withObject:phone]; 
} 
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"]; 
[phoneNumbers release]; 
2

NSArray सी/सी ++ शैली सरणी नहीं है। यह एक उद्देश्य-सी वस्तु है। इस पर संचालन करने के लिए आपको NSArray कक्षा के instance methods का उपयोग करने की आवश्यकता है।

उद्देश्य-सी में आप किसी ऑब्जेक्ट पॉइंटर को अपना मान निर्धारित करने के लिए कभी "अव्यवस्था" नहीं देते।

इसके अलावा, आप Fast Enumeration कहलाते हैं, जो उत्परिवर्तन की अनुमति नहीं देता है।

0

, मैं यह परीक्षण नहीं किया है, मैं 'बुरा विचार' के तहत इस फ़ाइल चाहते हैं और स्पर्श नहीं: आप एक NSMutableArray की आवश्यकता होगी। एनएसएआरएआरई, और कई अन्य कोको ऑब्जेक्ट्स, काफी जटिल हैं और क्लास क्लस्टर डिज़ाइन पैटर्न के हिस्से के रूप में हुड के तहत विभिन्न कार्यान्वयन हो सकते हैं।

तो जब यह नीचे आता है तो आप वास्तव में नहीं जानते कि आप आंतरिक रूप से क्या कर रहे हैं। एनएसएआरएआरई वास्तव में अपरिवर्तनीय होने के लिए डिज़ाइन किया गया है, इसलिए जगह संपादन में भी दोगुना बुरा विचार है।

ऑब्जेक्ट्स जो आपको आंतरिक रूप से गड़बड़ करने के लिए डिज़ाइन किए गए हैं, उन्हें NSMutableData के mutableBytes जैसे एपीआई विधियों के माध्यम से प्रदर्शित किया गया है।

आप संसाधित मूल्यों के साथ एक नया एनएस (उत्परिवर्ती) ऐरे बनाने से बेहतर हैं।

4

आप उद्देश्य-सी ऑब्जेक्ट चर को कम नहीं कर सकते हैं। वे हमेशा पॉइंटर्स होते हैं, लेकिन आपको उनका इलाज करना चाहिए जैसे कि वे परमाणु मूल्य हैं। आप जेनरेट कर रहे नए ऑब्जेक्ट्स को रखने के लिए सरणी को स्वयं को म्यूटेट करने की आवश्यकता है।

1

आप enumerateObjectsUsingBlock: का भी उपयोग कर सकते हैं।

NSArray *array = [NSArray array]; 
__block NSMutableArray *mutableCopyArray = [array mutableCopy]; 
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) { 
    [mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]]; 
}]; 

चेकआउट How do I iterate over an NSArray?

संबंधित मुद्दे