2011-05-18 55 views
0

我刚被卡住了。我有2个视图控制器,一个是“WatchListViewController”,第二个是“QuotesViewController”首先我从WatchListViewController推到QuotesViewController,我的动作写在这里。保留一个NSMutableArray的值?

-(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带有参数数组“分裂的” i收到此阵列中的我的initWithData并将其分配给我的其他阵列(generalArray)现在一般阵列分配给我tableView但在它之前reloadData的tableView其控制返回receiveData并返回并再次返回到我的QuotesViewController并重新加载表视图,但当时我的数组(generalArray)失去其值&值不会在表视图中加载值。 plz plz帮我我卡在这里。方法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]; 
} 
+0

当我读到最后一个声明时,我可能会清楚该链接是否丢失。 – Radix 2011-05-18 13:00:07

回答

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

希望这应该做到这一点。

+0

你说的太对了,但是这个回应来了之后推。感染此响应是从“ViewDidLoad”生成的请求。 – Mashhadi 2011-05-19 10:26:38

+0

所以你已经将'QuotesViewController'实例推到前面,然后触发一个请求,它应该在同一个实例中更新'general'数组? – 2011-05-19 10:32:51

+0

是的,正确的我正确 – Mashhadi 2011-05-19 14:54:20

0

你应该学习内存管理在Objective-C。您使用componentsSeparatedByString创建的数组是通过该方法自动释放的。所以,当你将它传递到QuotesViewController的initWithData方法,你需要的,如果你不知道该怎么做的东西,保留其在该法像

generalArray = [splits retain]; 

安置自己initWithData代码。

+0

thanx for reply这里是代码 - (void)initWithData:(NSArray *)_ general { \t general = [[NSMutableArray alloc] init]; //初始化,可以从类的访问的阵列 \t的for(int i = 0; I <[_general计数];我++){ \t \t \t \t [一般ADDOBJECT:[_一般objectAtIndex:ⅰ]]; \t \t \t \t \t } \t的NSLog(@ “%@”,普通); \t [self generalValues]; } - (void)generalValues { \t [generalTableView reloadData]; } – Mashhadi 2011-05-18 13:54:42

+0

你可以将你的代码作为编辑发布到你的问题吗?很难将它全部阅读成这样的评论。 – CharlieMezak 2011-05-18 13:55:53

+0

@Mashhadi:你可以避免将'_general'复制到'general'的循环:'general = [_general mutableCopy]' – SSteve 2011-05-18 13:58:48

0

在此代码:

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

要初始化quotesViewController两次。第二次初始化它时,您不存储返回值,因此您的参考将丢失。相反,你应该写

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

试试看看是否有帮助。