我刚被卡住了。我有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
答案 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];
尝试一下,看看它是否有帮助。