Рекомендовать дизайн класса в Objective-C - PullRequest
3 голосов
/ 12 июля 2010

Я новичок в Objective-c.В целях обучения я пытаюсь создать что-то вроде телефонной книги.Поэтому у меня будет класс с именем Person, который будет иметь некоторые свойства (имя, телефон и т. Д.).

Прямо сейчас я не озабочен постоянством.Но мне нужно что-то, чтобы «держать» объекты Person.Поэтому я подумал о создании класса с именем People, но я не знаю, как его проектировать, особенно NSMutableArray, который будет содержать объекты.

То, что я сделал, было:

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

Когда я пытаюсь использовать этот код, я получаю ошибку:_ метод отправлен в неинициализированный объект изменяемого массива .

Итак, поскольку я новичок, вероятно, способ, которым я это сделал, не самый лучший / правильный.Итак, как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 12 июля 2010

В People.m вы, вероятно, хотели написать

peopleArray = [[NSMutableArray alloc] init];

вместо

peopleArray = [[NSMutableArray alloc] retain];
2 голосов
/ 12 июля 2010

Две вещи не так с вашим инициализатором для людей. Это должно выглядеть примерно так:

- (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;
}
2 голосов
/ 12 июля 2010

Потому что вы не вызываете init для NSMutableArray при создании вашего peopleArray.Попробуйте позвонить:

peopleArray = [[NSMutableArray alloc] init];

.Вам не нужно сохранять его, если, например, вы не скажете, сделал ли это:

peopleArray = [[NSMutableArray array] retain];

По причинам почему см. правила управления памятью Эти правила очень важны для понимания любым разработчиком iPhone или Mac, и, честно говоря, они достаточно просты, и нет никаких оправданий.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...