Передача NSArray между классами - PullRequest
1 голос
/ 16 марта 2010

Итак, мой второй вопрос, основанный на этом приложении, я изучаю с Целью C. У меня есть класс источника данных, который на данный момент выглядит в основном как:

- (id) init
{
    if (self = [super init]){
    listNames =  [[NSArray alloc] initWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences",
                  @"Video",@"Library",@"Funeral", nil];
    NSLog(@"%@",listNames);
    }
    return self;
}

.h выглядит следующим образом:

@interface MainViewDataSource : NSObject {
    NSArray *listNames;
}

@property (nonatomic, retain) NSArray *listNames;
-(NSArray *)getListNames;

Так вот, где я это делаю. Теперь проблема в том, что когда я пытаюсь получить массив listNames, он ничего не возвращает.

Следующий кусок:

NSArray* data = [listData listNames];

Предполагается поместить информацию в listNames в данные, но ... нет. Так как я довольно привык к JAva, держу пари, что это причуда Objective C, которую я не знаю, как исправить. Вот почему я буду здесь просить о помощи. Как правильно обойти NSArrays, как этот?

Ответы [ 5 ]

1 голос
/ 16 марта 2010

Вы используете -init на MainViewDataSource?

MainViewDataSource *_source = [[MainViewDataSource alloc] init];
NSLog(@"listNames --> %@", [_source listNames]);
...
[_source release];

Также убедитесь, что ваш метод -dealloc включает release для listNames, иначе у вас будет утечка памяти.

0 голосов
/ 16 марта 2010

аксессоры ... аксессоры ... аксессоры ...

Используйте их ВСЕГДА. Без исключений (пока вы их не изучите).

когда вы делаете:

listNames =  [[NSArray alloc] initWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil];

вы действительно хотите делать:

[self setListNames:[NSArray arrayWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil];

или

self.listNames = [NSArray arrayWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil];

Установив listNames напрямую (без ссылки на себя), вы не используете средства доступа и откроете целый мир боли, когда попытаетесь устранить утечки. Чтобы попасть в ваш список, просто используйте метод доступа:

[self listNames];

или

self.listNames;

Опять же, избегайте соблазна НЕ использовать средства доступа.

0 голосов
/ 16 марта 2010

Я думаю, вы не инициализировали listData. Вы можете выделить и запустить его так:

MainViewDataSource* listData = [[MainViewDataSource alloc] init];

тогда вы можете получить указатель на массив следующим образом:

NSArray* data = [listData listNames]; 

OR

NSArray* data = listData.listNames;
0 голосов
/ 16 марта 2010

Не видя весь ваш код, я думаю, вам может понадобиться сохранить массив в другом классе. Идея в том, что если вы используете другой объект классов, вам нужно сохранить его, чтобы он не был освобожден с объектом MainViewDataSource. Попробуйте ...

NSArray* data = [[listData listNames] retain];

И посмотрите, сможете ли вы получить массив для печати. ​​

0 голосов
/ 16 марта 2010

Вы должны создать реализацию геттера. Компилятор может сделать это за вас, используя @synthesize:

@synthesize listNames;

Вам не нужно объявлять метод получения.

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