यह क्यों काम करता है:

self.array = newArray;

लेकिन यह नहीं है:

[[self mutableArray] addObject:object];

मतलब, मुझे इसे काम करने के लिए NSMutableArray में प्रवेश करने की आवश्यकता क्यों है जबकि मुझे NSArray में प्रवेश करने की आवश्यकता नहीं है?

संपादित करें: होप्स यह स्पष्ट है दोस्तों।

इंटरफेस:

@interface Foo : UIViewController {

}

@property (nonatomic, retain) NSArray *array;
@property (nonatomic, retain) NSMutableArray *mutableArray;

@end

कार्यान्वयन:

@implementation Foo

@synthesize array;
@synthesize mutableArray;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.array = [Class returningAnArray];
    [[self mutableArray] addObject:objectIHaveOmittedTheCode];
}

@end
-1
Peter Warbo 1 जुलाई 2011, 16:35
आपके द्वारा प्रदान किया गया कोड अपने आप काम नहीं करता है, और प्रश्न का कोई मतलब नहीं है, कृपया स्पष्ट करें या यह पोस्ट बंद हो जाएगी।
 – 
Joe
1 जुलाई 2011, 16:39
किसी भी मामले के बारे में निर्णय लेने के लिए वहां पर्याप्त जानकारी नहीं है। newArray कैसे बनाया जाता है? self क्या है, और क्या इसकी कोई mutableArray विधि है? यदि हां, तो यह क्या लौटाता है? यदि यह एक संपत्ति है, तो क्या इसे प्रारंभ किया गया है? अंत में, आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं?
 – 
Caleb
1 जुलाई 2011, 16:39
मैं आपका संपादन देखता हूं लेकिन कार्यान्वयन इंटरफ़ेस से मेल नहीं खाता। कृपया फिर से संपादित करें।
 – 
Richard Brightwell
1 जुलाई 2011, 16:48

3 जवाब

सबसे बढ़िया उत्तर
self.array = newArray;

इस पंक्ति में, आप self.array को पहले से निर्मित ऑब्जेक्ट असाइन कर रहे हैं। तो, आपको इसे बनाने की कोई आवश्यकता नहीं है।

[[self mutableArray] addObject:object];

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

2
EmptyStack 1 जुलाई 2011, 16:41

उद्देश्य-सी में NSArray वस्तुएं अपरिवर्तनीय हैं।

self.array = newArray;

यह लाइन एक संपत्ति असाइनमेंट है। self.array गुण स्मृति में किसी स्थान की ओर इशारा करते हुए एक संदर्भ देता है जिसमें एक NSArray ऑब्जेक्ट। संपत्ति को विभिन्न वस्तुओं को निर्दिष्ट करके आप वास्तव में वस्तु को स्वयं संशोधित नहीं कर रहे हैं।

यदि आप किसी मौजूदा NSArray को संशोधित करना चाहते हैं ऑब्जेक्ट, आपको एक NSMutableArray समान तत्वों वाली वस्तु:

NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:self.array];
[mutableArray addObject:object];

ध्यान दें कि NSMutableArray NSArray से इनहेरिट करता है , ताकि आप mutableArray द्वारा संदर्भित ऑब्जेक्ट को NSArray

2
Enrico Campidoglio 1 जुलाई 2011, 17:01
2
बस स्पष्ट होने के लिए, यह वास्तव में एक संपत्ति के लिए एक असाइनमेंट है। स्वयं में array नाम का वैरिएबल हो भी सकता है और नहीं भी।
 – 
Caleb
1 जुलाई 2011, 16:43

[Class returningArray] ने आपके लिए आवंटन किया। प्रत्येक वस्तु को उपयोग करने से पहले आवंटित (और प्रारंभ किया जाना चाहिए) की आवश्यकता होती है। समाधान है।

- (void)viewDidLoad {
    [super viewDidLoad];
    self.array = [Class returningAnArray];
    self.mutableArray = [NSMutableArray array];
    //Now you can use mutable array
    [[self mutableArray] addObject:objectIHaveOmittedTheCode];
}

अब आपने अपनी सरणी और अपनी परिवर्तनीय सरणी को स्पष्ट रूप से आवंटन को कॉल किए बिना बनाया है क्योंकि उन वर्गों ने इसे आपके लिए किया है।

2
Joe 1 जुलाई 2011, 17:50