保留NSMutableArray的值?

时间:2011-05-18 11:14:38

标签: iphone objective-c uitableview nsmutablearray

我刚被卡住了。我有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方法中我通过套接字向服务器发送一些请求,它在我的函数中收到响应和响应,在{ {1}}:

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; } } ,带有参数数组" splits"我在我的initWithData中收到这个数组并将其分配给我的另一个数组(initWithData)现在一般数组被分配给我的generalArray但在它的tableView之前,它的控制权返回到{reloadData 1}}并返回并再次返回我的receiveData并重新加载表视图,但那时我的数组(QuotesViewController)失去了它的价值&表视图中未加载值。 PLZ PLZ帮助我,我被困在这里。

方法代码initWithData:

generalArray

3 个答案:

答案 0 :(得分:1)

您正在C函数中创建一个QuotesViewController实例 -

[quotesViewController initWithData:splits];

您没有存储对此控制器的引用。 QuotesViewController的此实例极有可能在generalArray中具有正确的值。但由于您不存储它以供以后使用,因此会丢失引用并创建内存泄漏。

现在,如果您继续创建另一个QuotesViewController实例,它将不会有早期的generalArray数据,因为它是一个新实例。由于我不了解程序的流程,我发现很难建议正确的方法继续前进,但保存函数中的引用或数组本身是正确的。如果保存引用,只需将其推入导航控制器,如果保存数组,就可以在init方法中传递它。

修改

由于您正在讨论影响同一个控制器,因此您需要将该引用传递给该函数。

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

希望这可以做到。

答案 1 :(得分:0)

您应该在Objective-C中学习内存管理。使用componentsSeparatedByString创建的数组由该方法自动释放。因此,当您将其传递到QuotesViewController的initWithData方法时,您需要使用类似

之类的方法将其保留在该方法中
generalArray = [splits retain];

如果您不确定该怎么做,请发布您的initWithData代码。

答案 2 :(得分:0)

在此代码中:

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

您正在初始化quotesViewController两次。第二次初始化时,您没有存储返回值,因此您的引用将丢失。相反,你应该写

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

尝试一下,看看它是否有帮助。