NSString EXC_BAD_ACCESS цель C - PullRequest
       27

NSString EXC_BAD_ACCESS цель C

1 голос
/ 28 мая 2011

Я новичок в Objective C и у меня есть некоторые проблемы .... Это мой код: 1)

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 (не все):

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

Моя проблема: «EXC_BAD_ACCESS» в «but2Click»

Ответы [ 2 ]

1 голос
/ 28 мая 2011

Это будет действительно трудно понять из кода - вам придется отлаживать его.

Я написал этот блог, чтобы помочь понять и отладить EXC_BAD_ACCESS

По сути, вы разыменовываете указатель, указывающий на память, которая не выделена вашему процессу.Это может произойти по следующим основным причинам:

  1. Вы используете освобожденный объект
  2. Куча повреждена

Что вы должны сделатьдля отладки:

  1. Выполнить сборку и анализ.Отчеты об утечках плохие, но не связанные с этой проблемой - вы хотите искать проблемы с слишком малым числом удержаний

  2. Включить Зомби и запустить в отладчике .Теперь ни один из ваших объектов не будет освобожден, но когда у них будет счетчик сохранения 0, они будут жаловаться отладчику, если вы их используете.

В блоге есть и другие советы, которыенемного сложнее объяснить

1 голос
/ 28 мая 2011

Вы назначаете объект autorelease d здесь:

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

access_token должен быть освобожден до вызова метода but2click нажатием кнопки.

Вам нужно сохранить его, если вы хотите использовать его позже.

...