2009-09-08 36 views
8

मैं वास्तव में देखना चाहता हूं कि यह एक सरणी कैसे बनाता है। मैं .m फ़ाइलों को कैसे देख सकता हूं जो दिखाता है कि यह कैसे किया जाता है?क्या करता है -एरेविथअरे वास्तव में क्या करता है?

उत्तर

16

जैसा कि @ केन ने उल्लेख किया है, आप स्रोत नहीं देख सकते (हालांकि आप gdb के माध्यम से विधि को अलग कर सकते हैं)।

विधि अपने आप में एक अपरिवर्तनीय (बदला नहीं जा सकता), autoreleased दिया सरणी की प्रतिलिपि बनाता है। निम्नलिखित व्यवहार में समान हैं:

// Both resulting arrays are immutable and won't be retained 
NSArray* immutableArray = [[[NSArray alloc] initWithArray:mutableArray] autorelease]; 
NSArray* immutableArray = [NSArray arrayWithArray:mutableArray]; 
NSArray* immutableArray = [[mutableArray copy] autorelease]; 

ब्रेवटी के आधार पर जो भी आपको पसंद है उसे चुनें, मुझे लगता है :-)।

+0

हमम ... यह अपरिवर्तनीय है? खैर मुझे प्रत्येक ऑब्जेक्ट को नई सरणी में एक अतिरिक्त रिलीज संदेश (आवंटित आवंटित) में भेजने की आवश्यकता है ताकि कोई रिसाव न हो। मैं सभी वस्तुओं को एक अपरिवर्तनीय सरणी में कैसे छोड़ूं? – RexOnRoids

+0

वस्तुओं को सरणी द्वारा बनाए रखा जाता है जब वे जोड़े जाते हैं, इसलिए जब सरणी जारी की जाती है, तो अंदर की वस्तुओं को भी – slf

+0

जारी किया जाना चाहिए ताकि ऑब्जेक्ट्स को रिलीज़ संदेश भेजने के लिए आपको एक नई सरणी क्यों चाहिए? अपरिवर्तनीय अर्थ है कि ARRAY को बदला नहीं जा सकता है, आप सरणी के अंदर ऑब्जेक्ट्स को हमेशा बदल सकते हैं (या संदेश भेज सकते हैं) ... या बेहतर अभी तक, ऑटोरेलीज ऑब्जेक्ट्स उन्हें सरणी में जोड़ने से पहले और फिर आपको किसी चीज़ के बारे में चिंता करने की ज़रूरत नहीं है । –

2

नहीं, कोको खुला स्रोत नहीं है।

यदि आपके कोई प्रश्न है, तो आपको बस यह पूछना चाहिए।

+ (id)arrayWithArray:(NSArray *)array { 
    return [[[self alloc] initWithArray:array] autorelease]; 
} 

आप NSArray के लिए GNUStep स्रोत पढ़ सकते हैं, लेकिन ध्यान रखें कि यह कोको एपीआई का एक वैकल्पिक कार्यान्वयन है हो:

यह इसे लागू करने के एक वैध तरीका होगा।

2

यदि आप पूछ रहे हैं कि +arrayWithArray का उद्देश्य क्या है (-initWithArray के आस-पास एक ऑटोरेलीज रैपर होने के अलावा), तो मैं कहूंगा कि यह यह है: जब आप किसी सरणी की एक ऑटोरेलेज्ड प्रतिलिपि बनाना चाहते हैं तो इसका उपयोग करें। दूसरे शब्दों में, आप इसे इस तरह देख सकते हैं:

NSArray * original = /* ... */; 
NSArray * newArray = [NSArray arrayWithArray:original]; 

के बराबर है:

NSArray * original = /* ... */; 
NSArray * newArray = [[original copy] autorelease]; 

मैं कहना चाहता हूँ यह जब यह आपकी शैली के अनुकूल उपयोग करने के लिए सुविधा के लिए नहीं है।

+1

यह पूरी तरह सच नहीं है। आपकी धारणा यह है कि 'मूल' एक एनएसएआरएआरई है। लेकिन यह एनएसएआरएआरई से ली गई कुछ भी हो सकती है। और ऑब्जेक्ट की कक्षा अपनी 'प्रतिलिपि' लागू कर सकती है। इसलिए '[[मूल प्रतिलिपि] autorelease];' एनएसएआरएआरई वापस करने की गारंटी नहीं है। – Coyote

0

GNUstep, OpenStep कल्पना जहाँ से कोको और कोको टच उतरना की जीएनयू कार्यान्वयन, +arrayWithArray: लागू करता है इस प्रकार है:

/** 
* Returns a new autoreleased NSArray instance containing all the objects from 
* array, in the same order as the original. 
*/ 
+ (id) arrayWithArray: (NSArray*)array 
{ 
    id o; 

    o = [self allocWithZone: NSDefaultMallocZone()]; 
    o = [o initWithArray: array]; 
    return AUTORELEASE(o); 
} 

http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSArray.m?view=markup

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