开发者

Recommend class design in Objective-C

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]) {
   开发者_如何学JAVA   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?


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;
}


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. :)


In People.m you probably meant to write

peopleArray = [[NSMutableArray alloc] init];

instead of

peopleArray = [[NSMutableArray alloc] retain];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜