сохранить значение NSMutableArray? - PullRequest
0 голосов
/ 18 мая 2011

Я только что застрял. У меня есть 2 контроллера представления, один из которых "WatchListViewController", а второй - "QuotesViewController". Прежде всего я нажимаю от WatchListViewController до QuotesViewController, и мое действие записано здесь.

-(IBAction)qoutes
{
    QuotesViewController *nextController = [[QuotesViewController alloc] initWithQoutes:symbolForQoutes :exchangeForQoutes :appDelegate.s :code :exchange:exchangeCodeForQoutes];
    [self.navigationController pushViewController:nextController animated:YES]; 
}

работает отлично, мой initWithQoutes метод также работает хорошо, тогда в методе ViewDidLoad я посылаю некоторый запрос на сервер через сокет, и он дает ответ, и ответ получен в моей функции, которая находится в WatchListViewController:

void receiveData(CFSocketRef s, CFSocketCallBackType type,  CFDataRef address, const void *data, void *info)
{
    char *buffer = (char *)CFDataGetBytePtr((CFDataRef)data); //getting data from server side in a char type veriable "buffer"
    NSString *result = [NSString stringWithUTF8String:buffer]; // getting data in a string from  my buffer
    if (strstr(buffer, "QRES") != NULL) { //if this is a qoutes response
        splits = [result componentsSeparatedByString:@"|"]; //separating string by "|"
        body = [splits objectAtIndex:1]; // choosing index "1"
        splits = [body componentsSeparatedByString:@","]; // separating by ","
        QuotesViewController *quotesViewController = [[QuotesViewController alloc] init];
        [quotesViewController initWithData:splits];
        return;
    }
}

ответ получен и он передается методу initWithData с массивом параметров «разделяется». Я получаю этот массив в моем initWithData и назначаю его другому массиву (generalArray), теперь общий массив назначен моему tableView но до этого reloadData tableView его управление возвращается к receiveData и возвращается и снова возвращается к моему QuotesViewController и перезагружается представление таблицы, но в то время мой массив (generalArray) потерял свое значение, и значения не загружен в виде таблицы. Пожалуйста, помогите мне, я застрял здесь.

код метода initWithData:

-(void)initWithData:(NSArray *)_general
{ 
general = [[NSMutableArray alloc] init]; //initializing array that can be accessed out of the class 
for (int i=0; i< [_general count]; i++) { 
[general addObject:[_general objectAtIndex:i]]; } 
NSLog(@"%@", general); [self generalValues]; 
} 
-(void)generalValues{ 

[generalTableView reloadData]; 
}

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Вы создаете экземпляр QuotesViewController здесь в вашей функции C как -

[quotesViewController initWithData:splits];

Вы не сохраняете ссылку на этот контроллер.Весьма вероятно, что этот экземпляр QuotesViewController имеет правильные значения в generalArray.Но поскольку вы не сохраняете его для последующего использования, ссылка теряется и создается утечка памяти.

Теперь, если вы продолжите создавать другой экземпляр QuotesViewController, у него не будет более раннего generalArray данные, поскольку это новый экземпляр.Поскольку я не понимаю, как работает ваша программа, мне трудно предложить правильный путь для продвижения вперед, но было бы правильно сохранить либо ссылку в функции, либо сам массив.Если вы сохранили ссылку, вы можете просто вставить ее в контроллер навигации или, если вы сохраните массив, вы можете передать его в методе init.

EDIT

Поскольку вы говорите о влиянии на тот же контроллер, вам нужно будет передать ссылку на функцию.

void receiveData(CFSocketRef s, CFSocketCallBackType type,  CFDataRef address, const void *data, void *info, QuotesViewController *controller)
{
    char *buffer = (char *)CFDataGetBytePtr((CFDataRef)data); //getting data from server side in a char type veriable "buffer"
    NSString *result = [NSString stringWithUTF8String:buffer]; // getting data in a string from  my buffer
    if (strstr(buffer, "QRES") != NULL) { //if this is a qoutes response
        splits = [result componentsSeparatedByString:@"|"]; //separating string by "|"
        body = [splits objectAtIndex:1]; // choosing index "1"
        splits = [body componentsSeparatedByString:@","]; // separating by ","
        [controller initWithData:splits];
        return;
    }
} 

Надеюсь, это должно быть сделано.

0 голосов
/ 18 мая 2011

В этом коде:

QuotesViewController *quotesViewController = [[QuotesViewController alloc] init];
[quotesViewController initWithData:splits];

вы инициализируете quotesViewController дважды. При второй инициализации вы не сохраняете возвращаемое значение, поэтому ваша ссылка теряется. Вместо этого вы должны написать

QuotesViewController *quotesViewController = [[QuotesViewController alloc] initWithData:splits];

Попробуйте и посмотрите, поможет ли это.

0 голосов
/ 18 мая 2011

Вы должны изучить управление памятью в Objective-C. Массив, который вы создаете с помощью componentsSeparatedByString, автоматически высвобождается этим методом. Поэтому, когда вы передаете его в метод initWithData QuotesViewController, вам нужно сохранить его в этом методе с помощью чего-то вроде

generalArray = [splits retain];

Опубликуйте свой код initWithData, если не знаете, что делать.

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