开发者

retain the value of an NSMutableArray?

开发者 https://www.devze.com 2023-03-06 22:45 出处:网络
I just got stuck. I have 2 view controllers one is \"WatchListViewController\" and 2nd is \"QuotesViewController\" first of all I am pushing from WatchListViewController to QuotesViewController and my

I just got stuck. I have 2 view controllers one is "WatchListViewController" and 2nd is "QuotesViewController" first of all I am pushing from WatchListViewController to QuotesViewController and my action is written here.

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

it works perfectly my initWithQoutes method is also working good, then in ViewDidLoad method I am sending some request to server via socket and it gives response and reponse is received in my function that is in 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;
    }
}

response is received and it goes to the method initWithData with a parameter array "splits" i receive this array in my initWithData and assign it to my other array (generalArray) now general array is assigned to my tableView but before it reloadData of tableView its control goes back to receiveData and return and come back again to my QuotesViewController and reload table view but at that time my array (generalArray) lost its value & values are not loaded in table view. plz plz help me i got stuck here.

code of method 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]; 
}


You are creating a QuotesViewController instance here in your C function as –

[quotesViewController initWithData:splits];

You are not storing a reference to this controller. It is highly likely that this instance of QuotesViewController has the proper values in generalArray. But since you are not storing it for later use, a reference is lost and a memory leak is created.

Now, if you go on to create another instance of QuotesViewController, it will not have earlier generalArray data as it is a new instance. Since I do not understand the flow of your program, I find it hard to suggest a proper way to go forward but it would be correct to save either the reference in the function or the array itself. If you save the reference, you can simply push it into the navigation controller of if you save the array, you can pass it in the init method.

EDIT

Since you are talking of affecting the same controller, you will need to pass the reference to the function.

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

Hopefully this should do it.


You should study memory management in Objective-C. The array you create with componentsSeparatedByString is autoreleased by that method. So when you pass it into the initWithData method of QuotesViewController, you need to retain it in that method with something like

generalArray = [splits retain];

Post your initWithData code if you're not sure what to do.


In this code:

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

you are initializing quotesViewController twice. The second time you initialize it, you are not storing the return value, so your reference is lost. Instead, you should write

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

Try that and see if it helps.

0

精彩评论

暂无评论...
验证码 换一张
取 消