2011-05-18 91 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]; 

試試看看是否有幫助。