Заполнение NSMutableArray с набором классов и затем получение их обратно - PullRequest
1 голос
/ 24 августа 2010

Надеюсь, я смогу это прояснить, но я новичок в Objective-C и, честно говоря, не очень хорош с массивами.

Итак, у меня есть класс Singleton (называемый SingletonState), который яЯ использую для передачи переменных вокруг моего приложения (пожалуйста, мы можем оставить, следует ли мне использовать Singleton классы из этого - я исправлю это позже).В этом классе у меня есть NSMutableArray (называемый arrayMyEvents).Я также создал класс, в котором я собираюсь хранить список событий (называемый EventClass).Когда пользователь входит в систему, я вызываю веб-сервис и возвращаю 3 строки.3-я строка представляет собой список значений, разделенных запятыми.Я анализирую данные и заполняю пользовательский класс EventClass.Затем я добавляю этот класс в SingletonState.arrayMyEvents.

У меня все это работает.Я могу перейти к другому ViewController и получить доступ к «количеству» элементов в arrayMyEvents.

ПРОБЛЕМА: теперь я хочу отредактировать один из «es» ScheduledEventsClass в моем массиве.Как мне получить к нему доступ, отредактировать некоторые свойства и обновить его в моем классе SingletonState?

Вот часть кода, который я пробовал:

NSString *sWebServiceEvents = [[NSString alloc] initWithFormat:@"%@", [result objectAtIndex:2]];

            if ( [ sWebServiceEvents isEqualToString:@"NULL" ] != true ) {

                NSArray *arrayEvents = [sWebServiceEvents componentsSeparatedByString:@","];

                // If the array has not been initialized they initialize it.
                if (sharedState.arrayMyEvents == nil) {
                    sharedState.arrayMyEvents = [[NSMutableArray alloc ] init ];
                }


                for (NSString * sEvent in arrayEvents) {
                    // Set equal to the value of the array (the Event Number) at the same
                    // position as the row that we are being asked to return a cell/row for.
                    EventClass *eventClass = [[EventClass alloc] retain];

                    eventClass.sEvent = sEvent;

                    [ sharedState.arrayEvents addObject:eventClass ];

                }

                NSLog(@"LoginView - sharedState.arrayMyEvents Count: %d", [sharedState.arrayMyEvents count]);
            }

Вот я пытаюсь получить доступ к нему в другом ViewController:

EventClass *eventClass =
[sharedState.arrayMyEvents objectAtIndex:row ];
NSLog(@"eventClass.sEventNumber: ", eventClass.sEventNumber);
eventClass.sLocation = @"Jason's Big Location";

Ответы [ 3 ]

1 голос
/ 24 августа 2010

У вас будут некоторые утечки памяти из цикла sEvent. [[EventClass alloc]retain] оставляет вам неинициализированный объект EventClass с числом ссылок 2. Вам нужно будет изменить его на [[[EventClass alloc] init] autorelease], чтобы предотвратить утечку. Массив NSEutableArray массива будет сохранять его во время вызова addObject :. (Разве это не должно быть [sharedState. arrayMyEvents addObject: eventClass] в цикле?)

После этого все, что вам нужно сделать для редактирования объекта EventClass во втором блоке кода, это отредактировать его. Переменная eventClass - это указатель на объект в массиве. Все, что сделано с этим объектом, не влияет на указатель, ссылающийся на него, оно влияет на данные, на которые он ссылается. Код, который вы имеете во втором блоке, должен изменить расположение выбранного объекта, как вы и предполагали.

У вас также есть несколько утечек памяти. Используйте Cmd-Shift-A для сборки со статическим анализатором, и он скажет вам, где.

0 голосов
/ 24 августа 2010

Спасибо Джону и St3fan, ваши ответы и время приветствуются !!!

Мне кажется, я понял свою проблему:

По сути, класс, который я создал (EventClass), настроил свойства следующим образом:

@property (nonatomic, assign) NSString *sStudyNumber;   
@property (nonatomic, assign) NSString *sTheater;

но, они должны быть (или, по крайней мере, я заставил это работать так):

@property (nonatomic, retain) NSString *sStudyNumber;   
@property (nonatomic, retain) NSString *sTheater;

Затем, во втором представлении, я смог сделать это:

EventClass *eventClass = [sharedState.arrayMyEvents objectAtIndex:row ];
NSLog(@"MyEvents: %@", eventClass.sEventNumber);
    eventClass.sLocation = @"Jason's Big Location";

Затем я проверил это в другом методе представления, используя это, и оно все еще было там:

EventClass *eventClass = [sharedState.arrayMyEvents objectAtIndex:row ];
NSLog(@"MyEvents: %@", eventClass.sEventNumber);
NSLog(@"MyEvents: %@", eventClass.sLocation);

Я также проверил это в еще одном представлении, и значение было сохранено в SharedState.arrayMyEvents без проблем. :)

В конце концов, я считаю, что я сводился к разнице между «назначать» и «удерживать».

Теперь о утечках памяти: (

Пожалуйста, дайте мне знать, если вы видите какие-либо другие проблемы с этим.

Спасибо, Jason

0 голосов
/ 24 августа 2010

Возможно, проблема в том, что вы положили их в sharedState.arrayEvents, но попробуйте вынуть их из sharedState.arrayMyEvents.Различные переменные.

Также много утечек памяти.

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