2010-09-05 18 views
19

अब लगभग 2 सप्ताह के लिए एक्सकोड के साथ खेल रहा है, और एमवीसी के बारे में थोड़ा सा पढ़ रहा है। मुझे मॉडल को नियंत्रक से कनेक्ट करने का प्रयास करने में समस्या है क्योंकि मुझे अपने सिर को सरणी के चारों ओर लेना मुश्किल लगता है। जब मैं जावा में कुछ प्रोग्राम करता हूं तो मैं सरल सरणी को संभाल सकता हूं लेकिन मैं ओबीजे-सी NSArrays से डरता हूं।उद्देश्य-सी में ऑब्जेक्ट्स की एक सरणी बनाना।

अगर कोई मुझे वस्तुओं की एक सरणी पर कुछ सरल कॉल दिखाने के लिए बहुत दयालु होगा तो मैं हमेशा से आभारी रहूंगा।

मेरे मॉडल:

Person.h

#import <Foundation/Foundation.h> 

@interface Person : NSObject 
{ 
NSString *name; 
NSNumber *age; 
} 

@property(nonatomic, retain) NSString *name; 
@property(nonatomic, retain) NSNumber *age; 

@end 

Person.m

#import "Person.h" 
@implementation Person 
@synthesize name; 
@synthesize age; 
@end 

मैं अगर बहुत ही सरल, जबकि मैं कोशिश करते हैं और जानने के रखा है।

अब मेरी नियंत्रक कक्षा। मैं क्या करना चाहता हूं 40 'व्यक्ति' वस्तुओं की एक सरणी बनाओ। लेकिन मैं Obj सी में कोड में डाल करने के लिए है कि

Controller.h

#import <Foundation/Foundation.h> 
@class Person; 
@interface Controller : NSObject 
{ 
Person *person; 
} 
@property(nonatomic, retain) Person *person; 

-(void) doSomeWork; 

@end 

Controller.m

#import "Controller.h" 
#import "Person.h" 

@implementation Controller 

@synthesize person; 


-(IBAction)doSomeWork 
{ 
// I guess here is where i should create my array of 40 person objects 
} 

@end 

मेरे समस्या यह घोषित करने में है सही तरीका पता नहीं है आकार 40 की व्यक्ति वस्तुओं की सरणी। और फिर इसे पढ़ने और लिखने के लिए सरणी का उपयोग कैसे करें।

मेरी पोस्ट पढ़ने के लिए अग्रिम धन्यवाद।

+1

भयभीत न हों। एक उद्देश्य-सी सरणी जावा 'ऐरेलिस्ट ' की तरह है। यह एक ArrayList की तरह बढ़ सकता है और सिकुड़ सकता है, और किसी ऑब्जेक्ट को पकड़ सकता है (आप सरणी में ऑब्जेक्ट प्रकारों को मिश्रित कर सकते हैं)। –

+0

यह एक सरणी सूची झूठ नहीं है। यह बढ़ता/छोटा नहीं हो सकता है - केवल एक म्यूटेबल सरणी –

उत्तर

29

यहाँ एक उदाहरण है कि नियंत्रक कक्षा में एक NSMutableArray उदाहरण चर बनाता है और हर बार जब आप doSomeWork आह्वान है कि सरणी के लिए एक व्यक्ति वस्तु कहते है: कोको/CocoaTouch साथ ऑब्जेक्टिव-सी में

@interface Controller 

NSMutableArray *personArray; 

@end 
@implementation Controller 

- (void) viewDidLoad { 
    ................ 
    NSMutableArray *personsArray = [[NSMutableArray alloc] initWithCapacity:40]; 
} 

- (IBAction)doSomeWork { 
    Person *myPerson = [[Person alloc] init]; 
    myPerson.name = name; 
    myPerson.age = age; 

    [personsArray addObject:myPerson]; 
} 
@end 
+0

धन्यवाद ennuikiller! –

+0

यह दृष्टिकोण मेरे लिए काम नहीं कर रहा है .. – TechnocraT

+1

बढ़िया! अब मैं 'व्यक्तियों' के प्रत्येक तत्व के 'नाम' और 'आयु 'तक कैसे पहुंचूं? – JohnK

51

सरणी हैं काफी जावा से अलग तीन मुख्य अंतर हैं:

  1. Obj सी सरणियों किसी भी अन्य की तरह कक्षाएं हैं, और राशि कोई बिल्ट-इन भाषा में समर्थन करते हैं। जावा में, [] ऑपरेटरों के माध्यम से भाषा में सरणी का अंतर्निहित समर्थन होता है।

  2. ओबीजे-सी सरणी untyped हैं, वे NSObject से विरासत में प्राप्त कोई भी वस्तु लेते हैं। इसका मतलब यह है कि आप एक ही सरणी के भीतर प्रकारों को मिश्रित कर सकते हैं, हालांकि यह संभवतः खराब अभ्यास है जब तक कि आपके पास बहुत अच्छा कारण न हो। (ध्यान दें कि int, double, char, BOOL और अन्य में निर्मित प्रकार NSObject से विरासत नहीं है, ताकि आप उन्हें NSNumber वस्तुओं में रैप करने के लिए अगर आप कभी भी उन्हें एक सरणी में रखना चाहते हैं होगा।)

  3. Obj-C arrays वास्तव में एक निश्चित लंबाई की अवधारणा नहीं है, जब तक कि पूरी सरणी अपरिवर्तनीय नहीं है। इसलिए जब आप सरणी बनाते हैं तो आपको लंबाई पर निर्णय लेने की आवश्यकता नहीं होती है।

एक परिवर्तनीय सरणी बनाने के लिए, यानी।वह हो जिस पर वस्तुओं को बदलने की अनुमति कर रहे हैं (और यहां तक ​​जोड़ने के लिए और वस्तुओं को हटाने, सरणी की लंबाई को बदलने), आपके द्वारा बनाए गए एक NSMutableArray:

myArray = [[NSMutableArray alloc] init]; 
// Could also use initWithCapacity: 40, but not necessary. 

जैसे आपका Person का एक उदाहरण के रूप में एक वस्तु, जोड़ने के लिए, आप addObject: विधि कॉल, या तो एक नया Person बनाने वहीं, या एक मौजूदा एक के लिए यह एक सूचक दे ​​रही है:

[myArray addObject: [[[Person alloc] init] autorelease]]; 
[myArray addObject: someOtherPerson]; 
// Last line adds some other person I already had a pointer to. 

एक वस्तु को निकालने के लिए आप removeObjectAtIndex: या removeLastObject उपयोग कर सकते हैं। प्रतिस्थापित करने के लिए, आप replaceObjectAtIndex:withObject: पर कॉल करें। किसी ऑब्जेक्ट को अपनी सरणी के बीच में डालने के लिए (और याद रखें, यह सरणी के आकार को भी बढ़ाएगा), आप insertObject:atIndex: पर कॉल करते हैं।

जो सबसे महत्वपूर्ण विधियों को उत्परिवर्तित करता है, यानी NSMutableArray पर विशिष्ट। बेशक, आपके पास विधियां भी हैं जो केवल एक सरणी देखती हैं, और जिन्हें NSArray में परिभाषित किया गया है। सबसे महत्वपूर्ण लोग count हैं, जो वर्तमान में तत्वों की संख्या देते हैं, और objectAtIndex: देते हैं, जो आपके द्वारा प्रदान की गई इंडेक्स पर ऑब्जेक्ट देते हैं।

जाना चाहिए तुम्हें अपने सरणी में कुछ Person वस्तुओं है, तो आप इस तरह उन पर पुनरावृति कर सकते हैं:

for (int i = 0; i < [myArray count]; i++) { 
    Person* p = [myArray objectAtIndex: i]; 
    // Do something with p 
} 

शायद आप सोच सकते है कि कैसे आप इस तरह के रूप में एक NSArray बनाएंगे, यदि आप जोड़ने की अनुमति नहीं कर रहे हैं इसके लिए खैर, इसके रचनाकारों में से एक initWithObjects: है, जो आपको जोड़ने के लिए वस्तुओं की अल्पविराम से अलग सूची लिखने की अनुमति देता है (और आपको nil मान के साथ समाप्त करने की आवश्यकता है)। एक और initWithArray: है, जो आपको एक और सरणी (जो म्यूटेबल हो सकता है) पास करने की अनुमति देता है, और कन्स्ट्रक्टर नया बनाते समय प्रदत्त सरणी से ऑब्जेक्ट्स का उपयोग करेगा।

+0

:) मुझे लगता है कि मैं इसे अभी प्राप्त करना शुरू कर रहा हूं! तो आपके ऊपर अपने अंतिम कोड स्निपर में व्यक्ति के उदाहरण को वापस सरणी से बाहर निकालें और इसे 'पी' में संग्रहीत करें। तो मैं उस व्यक्ति के डेटा को int personAge = p.age जैसे कुछ कर कर जांच सकता था; या अगर मैं उस वस्तु को अद्यतन करना चाहता था तो मैं p.age = 24 बदल सकता था; फिर replObjectAtIndex का उपयोग कर उस इंडेक्स में सरणी में पी वापस लिखें: पी: इंडेक्स –

+0

@ कोड: अंतिम बिंदु को छोड़कर सही। यदि आपने 'p.age = 24' किया है, तो वह सरणी में संग्रहीत 'व्यक्ति' ऑब्जेक्ट में तुरंत दिखाई देगा। आप यहां प्रोग्रामिंग भाषा अर्थशास्त्र के एक केंद्रीय भाग पर हैं: जब आप 'objectAtIndex:' कहते हैं, तो आपको पहले से मौजूद 'व्यक्ति' के लिए ** सूचक ** प्राप्त होता है, आपको 'व्यक्ति' की प्रति प्राप्त नहीं होती है आप बदल सकते हैं और फिर वापस डाल सकते हैं। – harms

+0

Awhh! यह वास्तव में अच्छा है। और थोड़ा पागल जो मुझे नहीं पता था- - –

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