2011-05-28 1 views
1

objectif Je suis nouveau dans l'objectif C et j'ai un problème .... Il est mon code: 1)NSString EXC_BAD_ACCESS C

testAppDelegate.h (not all): 
    @interface testAppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSWindow *windowLogin; 
    IBOutlet NSWindow *windowContactList; 
    IBOutlet NSTextField *memStatus; 
    NSString *access_token, *expires_in, *user_id; 
    NSMutableArray *records;} 

2) testAppDelegate.m (pas tous):

int posInStr(NSString *subString, NSString *genString){ 
    NSRange match; 
    match = [genString rangeOfString:subString]; 
    return match.location; 
} 

NSString* pars(NSString *str_,NSString *str,NSString *_str){ 
    NSString *tmp; 
    int startPos = posInStr(str_,str) + [str_ length]; 
    tmp = [str substringFromIndex:startPos]; 
    int finishPos = posInStr(_str, tmp); 
    return [tmp substringToIndex:finishPos]; 
} 

-(IBAction)but2Click: (id)sender{ 
    NSString *tmp2 = access_token; 
    NSString *tmp = [NSString stringWithFormat:@"https://api.vkontakte.ru/method/messages.getDialogs?count=3&access_token=%@",tmp2]; 
    NSURL *url = [NSURL URLWithString:tmp]; 
    NSLog(@"%@",tmp); 
    NSLog(@"%@",url); 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(showLoaded)]; 
     [request startAsynchronous]; 
} 

-(IBAction)but1Click:(id) sender{ 
    NSURL *url = [NSURL URLWithString:@"http://api.vkontakte.ru/oauth/authorize?client_id=293&scope=friends,messages&redirect_uri=http://api.vkontakte.ru/blank.html&display=popup&response_type=token"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestFinishedtest:)]; 
    [request startAsynchronous]; 
} 
- (void)requestFinishedtest:(ASIHTTPRequest *)request 
{ 
    [memStatus setStringValue:@"Loading..."]; 
    NSString *tmp = [NSString stringWithFormat:@"%@",[request url]]; 
    [tmp retain]; 
    access_token = pars(@"access_token=", tmp, @"&"); 
    NSLog(@"%@",access_token); 
    expires_in = pars(@"expires_in=", tmp ,@"&"); 
    user_id = pars(@"user_id=", [NSString stringWithFormat:@"%@&",tmp], @"&"); 
    [memStatus setStringValue:@"Logined"]; 
    [windowLogin orderOut:nil]; 
    [windowContactList makeKeyAndOrderFront:self]; 
    [NSApp activateIgnoringOtherApps:YES]; 
} 

Mon problème: "EXC_BAD_ACCESS" dans "but2Click"

+0

Sur quelle ligne cette fonction est l'erreur? – Maz

Répondre

1

Vous assignez un objet d autorelease ici:

access_token = pars(@"access_token=", tmp, @"&"); 

access_token doivent être libérés avant la se but2click méthode est invoquée par un bouton tap.

Vous devez le conserver si vous voulez l'utiliser plus tard.

+0

Bon oeil! C'est définitivement un problème. –

1

Cela va être très difficile à comprendre à partir du code - vous devrez le déboguer.

J'ai écrit ce blog to help understand and debug EXC_BAD_ACCESS

Fondamentalement, vous déréférencement d'un pointeur qui pointe vers la mémoire non alloué à votre processus. Les principales raisons pour lesquelles cela pourrait se produire sont

  1. Vous utilisez un objet qui a été désallouée
  2. Le tas est corrompu

Les choses que vous devez faire pour déboguer ceci:

  1. Faire une construction et analyser. Les rapports de fuites sont mauvais, mais pas liés à ce problème - vous voulez rechercher des problèmes de trop peu de retenues

  2. Activez Zombies and run in the debugger. Maintenant, aucun de vos objets ne sera désalloué, mais quand ils ont un nombre de retenue 0, ils se plaindront au débogueur si vous les utilisez.

Il y a d'autres conseils sur le blog qui sont un peu plus difficile à expliquer