views:

69

answers:

3

I'm new to Objective-c. For learning purposes I'm trying to build something like a phonebook. So I'll have a class called Person that will have some properties (name, phone, etc).

Right now I'm not preoccupied about persistence. But, I need something to "hold" Person objects. So I thought about create a class called People, but I don't know how to design it, specially the NSMutableArray that will hold the objects.

What I did was:

PERSON.H

@interface Person : NSObject {
   NSString *name;
}
@property(readwrite, copy) NSString *name;
@end

PERSON.M

@implementation Person
@synthesize name;
@end

PEOPLE.H

@interface People : NSObject {
   NSMutableArray *peopleArray;
}
@property(readwrite, retain) NSMutableArray *peopleArray;
- (void)addPerson:(Person *)objPerson;
@end

PEOPLE.M

@implementation People
@synthesize peopleArray;
- (id)init {
   if (![super init]) {
      return nil;
   }
   peopleArray = [[NSMutableArray alloc] retain];
   return self;
}
- (void)addPerson:(Person *)objPerson {
   [peopleArray addObject:objPerson];
}

PHONEBOOK.M

...
Person *pOne = [[Person alloc] init];
pOne.name =@"JaneDoe";

People *people = [[People alloc] init];
[people addPerson:pOne];

When I try to use this code, I receive an error:_method sent to an uninitialized mutable array object.

So, since I'm a newbie, probably the way that I did isn't the best/correct one. So, how do I do this?

+2  A: 

Because you're not calling init on the NSMutableArray when you create your peopleArray. Try calling:

peopleArray = [[NSMutableArray alloc] init];

instead. You need not retain it unless you say for instance, did this:

peopleArray = [[NSMutableArray array] retain];

For reasons why, see the rules for memory management. These rules are very important for any iPhone or Mac developer to understand, and quite frankly, are simple enough that there's no excuse. :)

jer
+2  A: 

In People.m you probably meant to write

peopleArray = [[NSMutableArray alloc] init];

instead of

peopleArray = [[NSMutableArray alloc] retain];
BoltClock
+2  A: 

Two things wrong with your initialiser for people. It should look more like this:

- (id)init {
   self = [super init];   // always assign the result of [super init] to self.
   if (!self) {
      return nil;
   }
   peopleArray = [[NSMutableArray alloc] init];  // use init not retain.
   return self;
}
JeremyP